尝试使用事件处理程序 winform 从 DataGridView 读取时出错
getting error when trying to read from DataGridView with event handler winform
我有一个 winform,它有一个 gridview,我正在通过数据集向其应用数据。当数据绑定时,它会调用 SelectionChanged 事件处理程序。我对此进行了研究,并通过添加一个 if 子句来查看 DGV 是否具有焦点(我发现所有其他解决方案均无效)找到了解决方法。该部分正在按计划工作。当我单步执行程序时,事件处理程序在绑定数据时会尝试执行代码 3 次。 if 子句阻止它到达代码。我的问题是在数据绑定之后,然后我在 DGV 中选择一行,然后事件处理程序抛出 "An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll"。单步执行代码时,DGV 将正确的行索引返回到我的 'int row' 变量,但是我用来获取 row/cell 信息的代码在将其应用于 [=15= 之前抛出错误] 多变的。我需要帮助。您可以忽略顶部的第二个 DGV。它获取所选行的信息并获取另一个 DB table 信息。另外,如果有帮助,我没有将数据源应用于程序或为返回的每个单独数据集创建数据集,我在返回数据时使用系统的通用数据集。
private void gvMainSelectResults_SelectionChanged(object sender, EventArgs e)
{
if (gvMainSelectResults.Focused)
{
gvMainArchiveResults.DataSource = null; //second DGV that is populated later and everytime is cleared with a new selection
loadTableID = 0;
orgID = 0;
dbFileName = "";
sourceType = "";
int row = gvMainSelectResults.CurrentCell.RowIndex;
loadTableID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["LoadTableID"].Value); //this is where I get the error, even if the "int row" has the correct index number
orgID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["OrganizationID"].Value);
dbFileName = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["FileName"].Value);
sourceType = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["SourceType"].Value);
more code here...
您正在使用 RowIndex 值从 SelectedRows 集合中获取文本。
但是这个集合只包含
Gets the collection of rows selected by the user.
这意味着该集合仅包含您的网格中存在的行的子集。当 RowIndex 为 2 并且您在 SelectedRows 集合中只有一行时,您会得到 OutOfRange 异常。
对于 RowIndex 值,您应该引用 Rows 集合
loadTableID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["LoadTableID"].Value);
orgID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["OrganizationID"].Value);
dbFileName = Convert.ToString(gvMainSelectResults.Rows[row].Cells["FileName"].Value);
sourceType = Convert.ToString(gvMainSelectResults.Rows[row].Cells["SourceType"].Value);
我有一个 winform,它有一个 gridview,我正在通过数据集向其应用数据。当数据绑定时,它会调用 SelectionChanged 事件处理程序。我对此进行了研究,并通过添加一个 if 子句来查看 DGV 是否具有焦点(我发现所有其他解决方案均无效)找到了解决方法。该部分正在按计划工作。当我单步执行程序时,事件处理程序在绑定数据时会尝试执行代码 3 次。 if 子句阻止它到达代码。我的问题是在数据绑定之后,然后我在 DGV 中选择一行,然后事件处理程序抛出 "An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll"。单步执行代码时,DGV 将正确的行索引返回到我的 'int row' 变量,但是我用来获取 row/cell 信息的代码在将其应用于 [=15= 之前抛出错误] 多变的。我需要帮助。您可以忽略顶部的第二个 DGV。它获取所选行的信息并获取另一个 DB table 信息。另外,如果有帮助,我没有将数据源应用于程序或为返回的每个单独数据集创建数据集,我在返回数据时使用系统的通用数据集。
private void gvMainSelectResults_SelectionChanged(object sender, EventArgs e)
{
if (gvMainSelectResults.Focused)
{
gvMainArchiveResults.DataSource = null; //second DGV that is populated later and everytime is cleared with a new selection
loadTableID = 0;
orgID = 0;
dbFileName = "";
sourceType = "";
int row = gvMainSelectResults.CurrentCell.RowIndex;
loadTableID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["LoadTableID"].Value); //this is where I get the error, even if the "int row" has the correct index number
orgID = Convert.ToInt32(gvMainSelectResults.SelectedRows[row].Cells["OrganizationID"].Value);
dbFileName = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["FileName"].Value);
sourceType = Convert.ToString(gvMainSelectResults.SelectedRows[row].Cells["SourceType"].Value);
more code here...
您正在使用 RowIndex 值从 SelectedRows 集合中获取文本。
但是这个集合只包含
Gets the collection of rows selected by the user.
这意味着该集合仅包含您的网格中存在的行的子集。当 RowIndex 为 2 并且您在 SelectedRows 集合中只有一行时,您会得到 OutOfRange 异常。
对于 RowIndex 值,您应该引用 Rows 集合
loadTableID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["LoadTableID"].Value);
orgID = Convert.ToInt32(gvMainSelectResults.Rows[row].Cells["OrganizationID"].Value);
dbFileName = Convert.ToString(gvMainSelectResults.Rows[row].Cells["FileName"].Value);
sourceType = Convert.ToString(gvMainSelectResults.Rows[row].Cells["SourceType"].Value);