Winforms 尝试使用事件处理程序winform从DataGridView读取时出错

Winforms 尝试使用事件处理程序winform从DataGridView读取时出错,winforms,exception,datagridview,eventhandler,Winforms,Exception,Datagridview,Eventhandler,我有一个winform,它有一个gridview,我通过数据集将数据应用到该gridview。当数据绑定时,它调用SelectionChanged事件处理程序。我对此进行了研究,并找到了一种解决方法,添加了一个if子句来查看DGV是否具有焦点(我发现的所有其他分辨率都不起作用)。那部分工作按计划进行。当我单步执行程序时,事件处理程序在绑定数据时会尝试遍历代码3次。if子句阻止它到达代码。我的问题是,在数据绑定之后,我在DGV中选择了一行,事件处理程序然后抛出“mscorlib.dll中发生了“S

我有一个winform,它有一个gridview,我通过数据集将数据应用到该gridview。当数据绑定时,它调用SelectionChanged事件处理程序。我对此进行了研究,并找到了一种解决方法,添加了一个if子句来查看DGV是否具有焦点(我发现的所有其他分辨率都不起作用)。那部分工作按计划进行。当我单步执行程序时,事件处理程序在绑定数据时会尝试遍历代码3次。if子句阻止它到达代码。我的问题是,在数据绑定之后,我在DGV中选择了一行,事件处理程序然后抛出“mscorlib.dll中发生了“System.ArgumentOutOfRangeException”类型的未处理异常”。单步执行代码时,DGV会将正确的行索引返回给我的“int row”变量,但我用于获取行/单元格信息的代码会在将其应用于“loadtableID”变量之前抛出错误。我需要帮助。可以忽略顶部的第二个DGV。它获取所选行的信息并获取另一个DB表信息。此外,如果有帮助的话,我没有将数据源应用于程序,也没有为返回的每个数据集创建数据集,我在返回数据时使用系统的通用数据集

     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集合中获取文本。
但此集合仅包含

获取用户选择的行的集合

这意味着集合只包含网格中存在的行的子集。当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);

您所指的DGV不是同一台,而是另一台。我有2个(gvMainSelectResults,这是一个填充的,和gvMainArchiveResults,它使用第一个的信息填充第二个,所以每次他们选择新行时,第二个DGV都会清除自己并应用新的数据集)。这就是为什么gvMainArchiveResults被放在代码顶部的原因。我明白了,但我想我现在已经找到了问题所在。更新答案Steve,您知道为什么当数据源应用于第一个gridview时,会调用事件处理程序并连续运行3次吗?我希望第一个数据集中的第一行项目用归档数据填充第二个数据源,并让我的变量保留信息。因为如果只返回一个项目,我不希望用户必须实际选择一个项目。不知道,数据源设置会导致其他情况。您有其他事件处理程序吗?在这里的更多代码中。。。您是否有一些可以更改当前选定行的代码?如果没有完整的代码和数据,很难说清楚。您可以尝试注释掉部分代码并检查事件处理程序中是否有更改,或者只是从设计器中删除事件处理程序的设置,在设置数据源后在代码中设置它,然后从代码中选择第一行否,即使事件处理程序中没有代码,也会发生这种情况。它仍然在括号中运行了3次。当我为数据库中访问的每个表创建了单独的数据集时,我从来没有遇到过这种情况。这一次我要创建的数据太多了,所以我在winforms上使用了包含的数据集。我可以删除if子句,只要让它在代码中运行3次,现在我们已经修复了我的索引错误。。。