DataGridView中的CellClick事件和SelectionChanged事件

VuS*_*ate 1 c# events datagridview winforms

Windows Froms DataGridView控件中的CellClick事件和SelectionChanged事件有什么区别?

当确切的选择更改事件运行时:在表单加载事件之前或之后?

Dav*_*all 6

这类问题的最佳参考是MSDN DataGridView文档.

对于CellClick事件,他们说:

单击单元格的任何部分(包括边框和填充)时会发生此事件.当按钮单元格或复选框单元格具有焦点时,用户按下并释放SPACE键时也会发生这种情况,如果在按下SPACE键的同时单击单元格,则会发生两次这些单元格类型.

对于SelectionChanged事件:

无论是以编程方式还是通过用户操作,只要选择单元格或取消选择,就会发生此事件.例如,当您想要显示当前所选单元格的总和时,此事件非常有用.

明显不同的是,即使DataGridView选择没有改变,CellClick也可以触发,例如右键单击或单击当前选定的单元格.此外,无需单击单元格即可更改选择,例如,以编程方式更改选择时.

至于什么时候选择更改事件是相对于表单加载事件运行的,当它附加在表单构造函数中时,它在之前(并且在那几次!).

我刚用以下代码证明了这一点:

public Form1()
{
    InitializeComponent();

    MyBindingList<BackingObject> backing_objects = new MyBindingList<BackingObject>();
    backing_objects.Add(new BackingObject{ PrimaryKey = 1, Name  = "Fred", Hidden = "Fred 1"});          

    dataGridView1.DataSource = backing_objects;

    this.Load += new EventHandler(Form1_Load);
    dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);
}

void Form1_Load(object sender, EventArgs e)
{
    Console.WriteLine("Load");
}

void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    Console.WriteLine("Selection Changed");            
}
Run Code Online (Sandbox Code Playgroud)

输出窗口显示:

Selection Changed
Selection Changed
Selection Changed
Load
Run Code Online (Sandbox Code Playgroud)

请注意,您可以选择改变火灾由DataBindingComplete事件处理期间,将其附着Load事件.

dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);
}
Run Code Online (Sandbox Code Playgroud)

现在在输出窗口中,您只看到:

Load
Run Code Online (Sandbox Code Playgroud)

并且在更改网格选择之前没有选择更改输出(例如通过单击单击)