如何使用数据集将数据导入数据网格?

时间:2012-09-03 14:15:30

标签: c# c#-4.0

这段代码有什么问题?我想填充datagridview1中的所有用户,但datagridview不显示任何内容。

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;
}

2 个答案:

答案 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];

答案 1 :(得分:-1)

以下内容可能被认为是一个重要的评论,而不是一个答案,这就是为什么我做出了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块中。

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

相反,我建议您在代码中将异常处理放在一个非常高的级别。对于Windows窗体应用程序,最好在事件处理程序中保留异常处理,以便不允许异常从事件中“转义”。更好的做法是在全球范围内进行这种最后的处理,但我从来没有在WinForms应用程序中这样做,所以无法告诉你如何。