【问题标题】:How to get data into datagrid using dataset?如何使用数据集将数据导入数据网格?
【发布时间】:2012-09-03 14:15:29
【问题描述】:

这段代码有什么问题?我想填充 datagridview1 中的所有用户,但 datagirdview 什么也不显示。

private void button4_Click( object sender, EventArgs e )
{
    dataGridView1.AutoGenerateColumns = true;
    dataGridView1.DataSource = db.todosUsuario("select usuario from usuarios");
}

//DB class
public DataSet todosUsuario(string query)
{
    DataSet dt= new DataSet();
    try
    {
        MySqlConnection cnn = new MySqlConnection(MysqlConnect());
        cnn.Open();
        MySqlDataAdapter da = new MySqlDataAdapter(query, cnn);
        da.Fill(dt,"Usuario");
        cnn.Close();
    }
    catch(Exception ed)
    {
        MessageBox.Show(ed.ToString());
    }
    return dt;
}

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    您正在将 DataGridView 绑定到 DataSet。
    在数据集中有多个表,因此您需要使用 DataMember 属性指定应在 DataGrid 中显示的表。 (当您在表格集合中只有一个时也是如此)

    dataGridView1.AutoGenerateColumns = true; 
    DataSet ds = db.todosUsuario("select usuario from usuarios"); 
    dataGridView1.DataMember = ds.Tables[0].TableName;
    dataGridView1.DataSource = ds;
    

    您可以将代码绑定更改为单个表

    dataGridView1.DataSource = ds.Tables[0];
    

    【讨论】:

      【解决方案2】:

      以下可能被认为是一个重要的评论而不是一个答案,这就是为什么我做出了 CW 的答案。

      显示的代码存在许多问题。这些代表着早日改掉的好习惯。

      private void button4_Click(object sender, EventArgs e)
      {
          try
          {
              dataGridView1.AutoGenerateColumns = true;
              dataGridView1.DataSource = db.todosUsuario("select usuario from usuarios");
          }
          catch (Exception ex)
          {
              MessageBox.Show(ex.ToString(), "Exception");
          }
      }
      
      //DB class
      public DataSet todosUsuario(string query)
      {
          DataSet dt = new DataSet();
          using (MySqlConnection cnn = new MySqlConnection(MysqlConnect()))
          {
              cnn.Open();
              using (MySqlDataAdapter da = new MySqlDataAdapter(query, cnn))
              {
                  da.Fill(dt, "Usuario");
              }
              cnn.Close();
          }
          return dt;
      }
      

      连接和数据适配器对象都实现了IDisposable,因此应该包装在using 块中。

      此外,让每个方法都关注捕获异常并不是一个好主意,尤其是当您唯一能做的“处理”是显示错误消息时。特别是,通过在您的 DB 类中调用 MessageBox.Show,您要求它在 Windows 窗体应用程序中运行,并且违反了关注点分离。

      相反,我建议您在代码中将异常处理置于非常高的级别。对于 Windows 窗体应用程序,最好将异常处理保留在事件处理程序中,以免异常从事件中“逃脱”。更好的办法是在全球范围内进行这种最后的处理,但我从未在 WinForms 应用程序中这样做过,因此无法向您展示如何操作。

      【讨论】:

      • 异常处理与这个问题到底有什么关系?
      • OP 发布的代码显示了一个错误的异常处理示例。
      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2020-03-03
      • 2021-08-11
      • 1970-01-01
      • 2019-10-29
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多