唯一的DataGridViewComboBox每行工作与SelectedIndex错误

本文关键字:SelectedIndex 错误 工作 DataGridViewComboBox 唯一 | 更新日期: 2023-09-27 18:03:03

我设法让它工作(我相信),但我注意到一个错误时,切换行之间的下拉框。

如下所示:

第一行下拉列表包含{A, E, F}
第二行下拉列表包含{B, C, D, A}

两行显示的值都是a。我很好且正确地使用第1行的下拉菜单,然后很好且正确地使用第2行的下拉菜单。当我回到第一行的下拉菜单时,我得到一个错误,指出索引[3](这是第2行A的索引)超出了范围。


很明显,我不能在10rep下发布图像,所以我将尝试准确地重新创建错误消息

'在DataGridView中发生了以下异常:

系统。argumentoutofrangeexception: invalidargument = '8'的值对' selecteindex '无效。参数名称:SelectedIndex在System.Windows.Forms.ComboBox。set_SelectedIndex (Int32价值)在System.Windows.Forms.ListControl。DataManager_ItemChanged(对象发送方,ItemChangedEventArgs)在System.Windows.Forms.ListControl。SetDataConnection(对象newDataSource, BindingMemberInfo newDisplayMember, Booleanforce)…. ..'

我找遍了还是没办法解决这个问题,请看下面的代码。

    private void assignResourceGrid_CellBeginEdit_1(object sender, DataGridViewCellCancelEventArgs e)
    {
        if(assignResourceGrid.Columns["rscNameComboBox"].Index == e.ColumnIndex && e.RowIndex != -1)
        {
            resourceList.Clear();
            string currentRowTeam = assignResourceGrid.Rows[e.RowIndex].Cells[assignResourceGrid.Columns["PersistentTeam"].Index].Value.ToString();
            string currentRowDept = assignResourceGrid.Rows[e.RowIndex].Cells[assignResourceGrid.Columns["NAME"].Index].Value.ToString();
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            sql = "select distinct rsc.ID, '"ResourceName'" from rsc "
            + "inner join  persistentteamassign on rsc.id = persistentteamassign.rsc_id "
            + "where persistentteamassign.persistentteam_id = (select id from persistentteam where teamname = :currentTeam "
            + "AND department_id = (select id from departmentteam where name = :currentDept)) "
            + "AND rsc.'"ResourceName'" is not null";
            cmd = new OracleCommand(sql, conn);
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.Add("currentTeam", currentRowTeam);
            cmd.Parameters.Add("currentDept", currentRowDept);

            dreader = cmd.ExecuteReader();
            if (dreader.HasRows == true)
            {
                while (dreader.Read())
                resourceList.Add(new Resource
                {
                    id = Convert.ToInt64((dreader["ID"])),
                    name = (dreader["ResourceName"].ToString())
                });
            }
            DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(assignResourceGrid.Rows[e.RowIndex].Cells[assignResourceGrid.Columns["rscNameComboBox"].Index]);
            cell.DataSource = null;
            cell.Items.Clear();
            cell.DataSource = resourceList;
            cell.ValueMember = "name";
            cell.DisplayMember = "name";
        }

注意:
1. DataGridView正在被sql查询绑定。
2. 代码中提到的这3列分别绑定到数据库中的一个列。
3.然后,一旦用户开始键入资源名称,我就按每行应用自定义下拉列表。

rscNameComboBox中的值应该依赖于PersistentTeam &列名称。所有行的显示值都是相同的。这是因为一个人可以在多个团队中,但是团队有不同的成员。

唯一的DataGridViewComboBox每行工作与SelectedIndex错误

对于任何有类似问题的人,我找到了动态绑定每一行的解决方案。无论什么原因,我没有收到一个错误,通过拉'所有'的数据到一个表,然后只是使用rowfilter和绑定每个单元格动态基于该过滤表。这可以通过提前输入或使用下拉菜单来实现。

    private void assignResourceGrid_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        DataGridViewComboBoxCell cellRscName = (DataGridViewComboBoxCell)(assignResourceGrid.Rows[e.RowIndex].Cells["RscName"]);
        if (assignResourceGrid.Columns["RscName"].Index == e.ColumnIndex && e.RowIndex != -1)
        {
                deptName = assignResourceGrid.Rows[e.RowIndex].Cells["DeptTeamName"].Value.ToString()
                teamName = assignResourceGrid.Rows[e.RowIndex].Cells["PersistentTeamName"].Value.ToString()
                //show all resources on each team
                resourceData.Tables[0].DefaultView.RowFilter = "DepartmentName= '" + deptName+ "' "
                + "and TeamName= '" + teamName + "' ";
                cellRscName.DataSource = resourceData.Tables[0];
                cellRscName.DisplayMember = "ResourceName";
                cellRscName.ValueMember = "ResourceName";
        }
    }