DataGridView和定位数据

时间:2013-05-14 17:23:35

标签: c# winforms datagridview

我正在使用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>

3 个答案:

答案 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);
}