0

DataSource が DataTable に設定された DataGridView があります。したがって、このコードを例として使用してください。

DataTable table;
table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Last_Name", typeof(string));
table.Columns.Add("Male", typeof(Boolean));

DataRow row;

for (int i = 1; i < 10; i++)
{
    row = table.NewRow();
    row["Name"] = String.Format("Person {0}", i + 1);
    row["Last_Name"] = String.Format("Person Last Name {0}", i + 1);

    if (i % 2 == 0)
    {
        row["Male"] = true;
    }
    else
    {
        row["Male"] = false;
    }

    table.Rows.Add(row);
}

dataGridView1.DataSource = table;

テキストボックスの最初のセルの内容を表示するSelectionChangedイベントも購読しています。下記参照:

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentRow != null)
    {
        DataRowView row = dataGridView1.CurrentRow.DataBoundItem as DataRowView;
        if (row != null)
        {
            textBox1.Text = row.Row[0].ToString();
        }
    }
}

行を変更すると、SelectionChanged イベントが発生し、内容がテキスト ボックスに正しく表示されます。

これで、グリッドに新しい行を追加するボタンができました:

private void buttonAdd_Click(object sender, EventArgs e)
{
    DataRow row= table.NewRow();
    row["Name"] = "Bob";
    row["Last_Name"] = "Smith";
    row["Male"] = true;
    table.Rows.Add(row);
}

新しい行がグリッドに正常に追加されましたが、選択されていません。

そこで、RowsAdded イベントをサブスクライブして選択しようとします。

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];
}

したがって、これで行が正しく選択されるようになりましたが、SelectionChanged イベントは発生せず、テキスト ボックスには以前に選択された行の結果が表示されたままです。

これを回避するにはどうすればよいですか、または何が間違っていますか?

奇妙なことに、もう一度追加ボタンをクリックすると、最初のクリックで追加した行が選択されます!?

C#4.0 と Visual Studio 2012 を使用しています。

ありがとう

4

1 に答える 1

0

まず、ラベルを追加して変更した後に行を選択してみませんか?

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{            
    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}

イベントを発生させることによってのみラベルを変更したい場合は、最初にセルの選択を解除してみてください:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    dataGridView1.CurrentCell = null;

    dataGridView1.Rows[e.RowIndex].Selected = true;
    dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[0];

    textBox1.Text =  dataGridView1.Rows[e.RowIndex].ToString();
}
于 2013-06-13T08:40:18.820 に答える