我有DataGridView
DataTable
作为DataSource
,Label
显示DataGridView
中当前选定的单元格地址,最后有Button
MessageBox
该按钮会打开DataGridViews
以显示当前选定的相同单元格地址。
标签的文字在CellClick
DataSource/DataTable
事件中更新。
使用下面的图片作为示例:当选择最后一个“NewRow”时,标签将使用正确的第五行(5)索引正确更新。但是,当我单击按钮并显示相同的选定单元格地址时,行索引为四(4)。
我猜这与DataGridView
有关,因为如果dataGridView1.CurrentCellAddress
未绑定到数据源,则不会发生这种情况。
我有一个解决方法,但是我不明白为什么同一个方法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
答案 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
会将当前单元格移动到空白新行的上方一行。