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填充。

DataGridView和定位数据

通过修改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
}