每行使用SelectedIndex错误的唯一DataGridViewComboBox

时间:2014-05-12 20:28:55

标签: c# sql datagridview

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

见下文例如:

第1行下拉包含{A,E,F}第2行下拉包含{B,C,D,A}

两行中的显示值均为A.我正确使用第1行中的下拉列表,然后正确使用第2行中的下拉列表。当我回到第1行的下拉列表时,我得到一个错误,指出索引[3](第2行中A的索引)超出范围。

显然我不能发布10个以上的图像,所以生病了尝试重新创建错误信息。

' DataGridView中发生以下异常:

System.ArguementOutOfRangeException:InvalidArguement =' 8'的值 不适用于' SelectedIndex'。 参数名称:SelectedIndex   在System.Windows.Forms.ComboBox.set_SelectedIndex(Int32值)   在 System.Windows.Forms.ListControl.DataManager_ItemChanged(Object sender,ItemChangedEventArgs e)   在System.Windows.Forms.ListControl.SetDataConnection(Object 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&中的项目组合。名称列。所有行都有一个共同的显示值。这是因为一个人可以在多个团队中,但团队中有不同的成员。

1 个答案:

答案 0 :(得分:0)

对于有类似问题的人,我找到了动态绑定每一行的解决方案。无论什么原因我没有收到错误,只需将“全部”数据拉入表中,然后只使用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";
        }
    }