唯一的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 &列名称。所有行的显示值都是相同的。这是因为一个人可以在多个团队中,但是团队有不同的成员。
对于任何有类似问题的人,我找到了动态绑定每一行的解决方案。无论什么原因,我没有收到一个错误,通过拉'所有'的数据到一个表,然后只是使用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";
}
}