DataGridView和定位数据
本文关键字:数据 定位 DataGridView | 更新日期: 2023-09-27 18:13:25
我使用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
填充。
通过修改alabamasux的答案,我设法使它工作。
var index = myList[(int)myDataGridView.CurrentRow.Cells[2].Value];
myForm form = new myForm(index);
必须以某种方式将列表中的索引与行关联起来。一种方法是在网格中设置一个隐藏列,用于维护行与正确列表索引之间的映射。要添加隐藏列,请按如下方式修改插入代码:
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);
}
我真的不明白为什么这样做,当你可以用你想要的列表直接填充gridview:
类TestObject{公共字符串代码{获取;设置;}公共字符串文本{获取;设置;}}
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
}