|
>自分もそう思ったので、実験してみたのですがイベントは発生するんですよね
私がテストしたコードは以下の通りです。
「動かすためには?」ということで、掲示されたサンプルよりかなり変更してあります。
因みに環境は…
・VS2005
・フォーム上には単純にDataGridViewのみ
・BindingSourceもDataSetも無し。コード見るとわかりますが、その場でDataTable等の設定をしています。
・DataGridViewの設定
AllowUserToAddRows = False
AllowUserToDeleteRows = False
SelectionMode = FullRowSelect
MultiSelect = True(デフォルト)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable table = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
GetData();
this.dataGridView1.DataSource = table;
dataGridView1.ClearSelection();
}
private void GetData()
{
table.Columns.Add("C1");
table.Columns.Add("C2");
table.Columns.Add("C3");
table.Rows.Add("AA", "BB", "CC");
table.Rows.Add("DD", "EE", "FF");
table.Rows.Add("GG", "HH", "II");
table.Rows.Add("JJ", "KK", "LL");
}
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
StringBuilder builder = new StringBuilder();
foreach (DataGridViewRow row in ((DataGridView)sender).SelectedRows)
{
string id = ((DataRowView)row.DataBoundItem).Row["C1"].ToString();//row.Cells[0].Value.ToString();
builder.Append(id + ",");
}
MessageBox.Show("afterEnterValue = " + builder.ToString());
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (((DataGridView)sender).SelectedRows.Count < 1) return;
StringBuilder builder = new StringBuilder();
foreach (DataGridViewRow row in ((DataGridView)sender).SelectedRows)
{
string id = ((DataRowView)row.DataBoundItem).Row["C1"].ToString();//row.Cells[0].Value.ToString();
builder.Append(id + ",");
}
MessageBox.Show("selectedValue = " + builder.ToString());
}
}
このコード上では、DataGridViewのDataSourceが設定されたときにRowEnterとSelectionChangedイベントが数回(※)発生し、
表示直後に一行目をクリックしてもSelectionChangedイベントのみが反応することを確認しています。
但し、選択した行が1つしかない場合は表示直後の選択行が2行目以降であるとき、
複数であれば1行目が含まれていても反応します。
※行数かと思っていましたが、実際にはイベントの連鎖の回数でした。
この後、Shownイベントをはさめて細かくタイミングを調べてみたところ、
Shownイベントの直前にRowEnterイベントが発生しました。
もしかして、ロックさんの
>イベントは発生する
というのはこのことでしょうか??
|