这段代码有什么问题?我想填充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;
}
答案 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应用程序中这样做,所以无法告诉你如何。