我设法让它工作(我相信),但是当我在行之间的下拉菜单之间切换时,我注意到了一个错误。
见下文例如:
第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&中的项目组合。名称列。所有行都有一个共同的显示值。这是因为一个人可以在多个团队中,但团队中有不同的成员。
答案 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";
}
}