我正在使用DataGridView
来跟踪List<myObject>
。为了填充它,我使用这个foreach循环:
foreach (myObject object in myList)
{
if (object.Status == Status.Available)
{
myDataGridView.Rows.Add(object.Name, object.Status.ToString());
}
}
然后我使用一个事件为所选行中的对象创建一个新表单:
void myDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
var index = myList[myDataGridView.CurrentRow.Index];
myForm form = new myForm(index);
}
因此,在列表中项目的状态发生变化之前,这一点可以正常工作:
myList[10].Status = Status.Unavailable;
现在更新myDataGridView
时,我无法再使用行索引为10行以上的任何行打开正确的表单。我不知道该怎么做。
即使指数不再匹配,有人能告诉我如何打开正确的表格吗?
编辑:myList
在游戏中保留角色,有些人可以出租,有些则可以出租。我需要myDataGridView
仅填充状态为Available
的人。{/ p>
答案 0 :(得分:1)
通过修改alabamasux的答案,我设法让它发挥作用。
var index = myList[(int)myDataGridView.CurrentRow.Cells[2].Value];
myForm form = new myForm(index);
答案 1 :(得分:0)
我真的不明白为什么这样做,当你可以直接用你想要的列表填充gridview时:
类TestObject { 公共字符串代码{get;组; } public string Text {get;组; } }
void PopulateGrid()
{
TestObject test1 = new TestObject()
{
Code = "code 1",
Text = "text 1"
};
TestObject test2 = new TestObject()
{
Code = "code 2",
Text = "text 2"
};
List<TestObject> list = new List<TestObject>();
list.Add(test1);
list.Add(test2);
dataGridView1.DataSource = list; //THIS IS WHAT SHOULD DO IT
}
答案 2 :(得分:0)
不知何故,您必须将列表中的索引与行相关联。您可以这样做的一种方法是在网格中有一个隐藏列,用于维护行与正确列表索引之间的映射。要添加隐藏列,请按如下所示修改插入代码:
int i = 0;
foreach (myObject object in myList)
{
if (object.Status == Status.Available)
{
myDataGridView.Rows.Add(object.Name, object.Status.ToString(), i);
}
i++;
}
//Hide the third column
myDataGridView.Columns[2].Visible = false;
然后在CellDoubleClick事件期间,您可以引用此隐藏列以获取此行中项目的真实索引。
void myDataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
int listIndex = (int)myDataGridView.CurrentRow.Cells[2].Value;
var index = myList[listIndex];
myForm form = new myForm(index);
}