Noe*_*lle 8 c# datagridview winforms
我有DataGridView一个数据库填充.
我试图获取在RowEnter事件上选择的行的内容.我已将网格的选择模式设置为FullRowSelect
我尝试过以下方法:
int orderId = (int)dgUnprocessedCards.Rows[dgUnprocessedCards.SelectedCells[0].RowIndex].Cells[0].Value;
Run Code Online (Sandbox Code Playgroud)
这继续抛出错误
指数超出范围.必须是非负数且小于集合的大小.
任何帮助表示赞赏.
Dav*_*all 12
我刚刚在一个示例datagridview应用程序中尝试了这个,它运行得很好所以必须有一些你没有告诉过我们的事情.
首先要做的是将一个大的声明分解成离散的小语句,这样你就可以确切地看到失败的位置.
您可以将上面的代码重写为类似的内容以进行调试:
var cellindex = dgUnprocessedCards.SelectedCells[0].RowIndex;
var cellcollection = dgUnprocessedCards.Rows[cellindex].Cells[0];
int orderId = (int)dgUnprocessedCards.Value;
Run Code Online (Sandbox Code Playgroud)
此外,您应该能够执行以下操作来实现您的目标:
int orderId = (int)dataGridView1.SelectedRows[0].Cells[0].Value;
Run Code Online (Sandbox Code Playgroud)
这使用了一个更简洁的SelectedRows集合,我会说从datagridview访问所选项目的更常用方法.
最后,您可能希望检查值的转换,因为Value可能不一定是int.就像是:
int orderid;
if (!int.TryParse(cellcollection.Value.ToString(), out orderid))
{
// Some logic to deal with the fact that Value was not an int
}
Run Code Online (Sandbox Code Playgroud)
SelectionChanged事件何时引发?
现在 - 正如您所提到的,您的选择会在将数据加载到网格时更改事件.这似乎不会导致我的测试版本出现问题,但可能是您问题的一部分.
为什么会发生这种情况不应该与您正在使用的数据源类型相关,而是与附加选择更改的事件处理程序时相关.这是因为数据绑定会导致选择更改事件被引发.
如果为DataBindingComplete事件添加事件处理程序并在那里附加SelectionChanged或RowEnter事件处理程序,则不应在数据绑定期间看到调用处理程序.
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowEnter);
this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged);
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要删除设计器生成的事件附件,并引用设计器生成的方法才能使其生效.
| 归档时间: |
|
| 查看次数: |
59675 次 |
| 最近记录: |