带数据源的DataGridView报告两个不同的CurrentCellAddress行值

时间:2017-04-27 07:13:43

标签: c# datagridview datatable

我有DataGridView DataTable作为DataSourceLabel显示DataGridView中当前选定的单元格地址,最后有Button MessageBox该按钮会打开DataGridViews以显示当前选定的相同单元格地址。

标签的文字在CellClick DataSource/DataTable事件中更新。

使用下面的图片作为示例:当选择最后一个“NewRow”时,标签将使用正确的第五行(5)索引正确更新。但是,当我单击按钮并显示相同的选定单元格地址时,行索引为四(4)。

我猜这与DataGridView有关,因为如果dataGridView1.CurrentCellAddress未绑定到数据源,则不会发生这种情况。

enter image description here

我有一个解决方法,但是我不明白为什么同一个方法CurrentCellAddress似乎返回错误/不同的值。在单元格单击事件中调用方法DataTable gridData; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //FillGrid(); gridData = GetTable(); FillDT(gridData); dataGridView1.DataSource = gridData; label1.Text = "CurrentCellAddress: " + dataGridView1.CurrentCellAddress.ToString(); } private DataTable GetTable() { DataTable dt = new DataTable(); dt.Columns.Add("Col1", typeof(String)); dt.Columns.Add("Col2", typeof(String)); dt.Columns.Add("Col3", typeof(String)); return dt; } private void FillDT(DataTable dt) { for (int i = 0; i < 5; i++) { dt.Rows.Add("R" + i + "C1", "R" + i + "C2", "R" + i + "C3"); } } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { label1.Text = "CurrentCellAddress: " + dataGridView1.CurrentCellAddress.ToString(); } private void btnGetCellAddress_Click(object sender, EventArgs e) { MessageBox.Show("CurrentCellAddress: " + dataGridView1.CurrentCellAddress.ToString(),"Cell Address"); } // Method to fill the grid to show the values are correct // when the datagridview is not data bound private void FillGrid() { dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn()); for (int i = 0; i < 5; i++) { dataGridView1.Rows.Add("R" + i + "C1", "R" + i + "C2", "R" + i + "C3"); } } 时会发生什么,并且在单击按钮时稍后会调用相同的方法?选择没有改变,但看起来它们是不同的数字。谢谢你的帮助。

我用来测试这个代码...

COURSE_NUMBER

1 个答案:

答案 0 :(得分:1)

DataGridView控件的焦点丢失时,最终会调用OnValidating方法(source reference),其中包含以下代码:

// Current cell needs to be moved to the row just above the 'new row' if possible.
int rowIndex = this.Rows.GetPreviousRow(this.ptCurrentCell.Y, DataGridViewElementStates.Visible);

选择DataGridView中的单元格会继续关注控件,因此永远不会调用它。但是,使用按钮时焦点会丢失,OnValidating会将当前单元格移动到空白新行的上方一行。