c#windows窗体/基本数据网格

我在c#中遇到的一个问题是网上的信息似乎太多,以至于我无法找到最基本问题的正确答案。

我正在尝试做一些简单的事情:我有一个按钮,我点击它,它查询数据库并在我的窗体上填充数据网格。

private void button1_Click(object sender, EventArgs e) { SqlConnection c = new SqlConnection("Data Source = (local); Integrated Security = true; Initial Catalog = pubs; "); c.Open(); // 2 // Create new DataAdapter SqlCommand cmd = c.CreateCommand(); cmd.CommandText = @" SELECT * FROM Authors "; SqlDataReader reader = cmd.ExecuteReader(); dataGridView1.DataSource = reader; dataGridView1.DataBind(); } 

错误1’System.Windows.Forms.DataGridView’不包含’DataBind’的定义,也没有扩展方法’DataBind’接受类型’System.Windows.Forms.DataGridView’的第一个参数…..

我可能错过了“使用指令”,但哪一个? 多个Google搜索告诉我如何将Yahoo RSS Feed绑定到gridview或提供有关“使用指令”的各种模糊细节。

也许我错误地使用了SqlDataReader。 我应该使用SqlAdapter吗? windows c#表格在线的所有优秀基础教程发生了什么变化? 几个月前,我发现了一些很棒的教程,但他们似乎已经失去了他们的页面搜索function,而且我无法使用基本的谷歌搜索找到它们。

试试这个:

 using (SqlConnection conn = new SqlConnection("your connection string")) { conn.Open(); using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Authors", conn)) { using (SqlDataAdapter adap = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); adap.Fill(dt); dataGridView1.DataSource = dt; } } } 

DataGridView没有DataBind()方法,因为它不需要。 设置DataSource属性会为您处理绑定。 using()块将自动关闭并处理所有内容。

注意 :您应该使用有效的连接字符串替换“您的连接字符串”。 我把你的样品从我的样品中取出来避开水平滚动条,我不确定你的样本是否有效。 使用连接字符串运行代码时可能会出现运行时错误。 http://www.connectionstrings.com是确定有效连接字符串的绝佳资源。

更新 :而不是嵌套的using()块,你也可以这样做:

 using (SqlConnection conn = new SqlConnection("...")) using (SqlCommand cmd = new SqlCommand(@" SELECT * FROM Authors", conn)) using (SqlDataAdapter adap = new SqlDataAdapter(cmd)) { conn.Open(); DataTable dt = new DataTable(); adap.Fill(dt); dataGridView1.DataSource = dt; } 

我更喜欢嵌套的风格,但它对我来说是“一半,另外一半”。 通常,我会使用静态方法将这样的代码封装到一个类(称为“DataGetter”或其他)中,如:

 public static DataTable GetData(string query) { // do all the connecting and adapting and filling and so forth } 

这样点击按钮的代码就像下面这样简单:

 dataGridView1.DataSource = DataGetter.GetData("SELECT * FROM AUTHORS"); 

但是,我不会在我的代码的任何性能关键部分执行此操作,因为有时您希望在调用之间保留SqlCommand对象(及其SqlParameter集合)。 由于连接池(实际上,您不希望在任何情况下都保留它们),因此您无需在调用之间保留SqlConnection对象。

你没有错过使用指令; 只是WinForms DataGridView没有DataBind方法 。 只需分配DataSource就可以实现绑定; 你也不需要调用方法。

但是,我认为您不能将SqlDataReader指定为DataSource。 根据MSDN中的DataSource属性文档 ,DataSource必须是IList,IListSource,IBindingList或IBindingListView。 您可能需要将数据加载到DataTable或DataSet(或使用对象关系映射器填充的对象数据源),并将其用作DataSource。