繁体   English   中英

从绑定列表中删除元素并在 DataGridView 中选择一行后,该行在 Winforms C# 中也被删除

[英]After removing an element from binded list and select a row in DataGridView, that row is deleted too in Winforms C#

我知道标题太长了,我来解释一下情况:我将数据网格视图绑定到一个列表:

BindingList<MyViewModel> _list = new BindingList<MyViewModel>
{
    new MyViewModel{ Num =1 , Val ="test"},
    new MyViewModel{ Num =2 , Val ="test1"},
    new MyViewModel{ Num =3 , Val ="test2"},
};

dataGridView1.DataSource = _list;
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.MultiSelect = false;

我绑定了事件来监听 Delete 命令:

 dataGridView1.KeyDown += (s, ev) =>
        {
            if (ev.KeyCode == Keys.Delete)
            {
                var item = dataGridView1.SelectedRows[0].DataBoundItem as MyViewModel;

                if (item != null)
                {
                    _list.Remove(item);

                    dataGridView1.Rows[0].Selected = true;
                }
            }
        };

和视图模型看起来像:

public sealed class MyViewModel
{
    public string Val { get; set; }

    public int Num { get; set; }
}

在网格中,我将有 3 个项目:如果我删除项目 3,项目 2 也会被删除(或者可能隐藏)

为什么 ?

删除项目后,我想从数据网格中选择第一项dataGridView1.Rows[0].Selected = true; .

如果我删除dataGridView1.Rows[0].Selected = true; 然后很好,项目 2 是可见的。

您需要告诉表单引擎(和 DataGridView)您已经处理了该 KeyDown 事件,否则它(DataGridView)将接收键并执行其默认操作(删除一行)

dataGridView1.KeyDown += (s, ev) =>
{
    if (ev.KeyCode == Keys.Delete)
    {
        var item = dataGridView1.SelectedRows[0].DataBoundItem as MyViewModel;

        if (item != null)
        {
            _list.Remove(item);

            dataGridView1.Rows[0].Selected = true;
            ev.Handled = true;
        }
    }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM