0

このコードの何が問題になっていますか?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;
}
4

2 に答える 2

1

DataGridViewをDataSetにバインドしています。
データセットには複数のテーブルがあるため、DataMemberプロパティを使用してDataGridに表示するテーブルを指定する必要があります。(テーブルコレクションに1つしかない場合も同様です)

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];
于 2012-09-03T14:29:34.780 に答える
-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.ShowDBクラスで呼び出しを行うと、Windowsフォームアプリケーションで実行する必要があり、関心の分離に違反することになります。

代わりに、コードの非常に高いレベルで例外処理を配置することをお勧めします。Windowsフォームアプリケーションの場合、例外がイベントから「エスケープ」されないように、イベントハンドラーで例外処理を保持するのが最適な場合があります。このような最後の手段の処理をグローバルに実行する方がさらに良いでしょうが、WinFormsアプリケーションでこれを実行したことは一度もないので、その方法を示すことはできません。

于 2012-09-03T19:07:28.013 に答える