Windows DataGridView _RowCommand

3
我的背景基本上是ASP.Net,我被要求开发一个小型的Windows应用程序。我尝试使用网格来呈现和选择数据,并且我认为在Windows表单中与ASP.Net的GridView相当的是DataGridView。我还不确定这是否正确,在ASP.Net中,你有与网格相关联的_RowCommand事件,该事件在单击Commandbutton后触发。我还注意到没有DataKeyNames属性,因此我不知道如何将当前行键传递给单击的按钮。任何帮助都将不胜感激,谢谢!
我忘了提到:我的网格有两个DataGridViewButton类型的列,我不知道需要编写的事件以执行所选命令。

更新与按钮和数据绑定相关的示例。 - Marc Gravell
3个回答

0
如果您处于数据绑定状态,可以通过将 .CurrentRow.DataBoundItem 强制转换为所需类型来访问所有属性。否则,只需查看单元格,或在添加行时设置 .Tag
这是一个示例,展示了一个数据绑定的DataGridView和几个按钮,用于提取所选行的数据:
using System;
using System.ComponentModel;
using System.Windows.Forms;
class Person
{
    public string Name { get; set; }
    [DisplayName("Eye Color")]
    public string EyeColor { get; set; }
}
static class Program
{   
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        using (var form = new Form())
        using (var grid = new DataGridView { Dock = DockStyle.Fill})
        using (var btn1 = new Button { Dock = DockStyle.Bottom, Text = "Button 1"})
        using (var btn2 = new Button { Dock = DockStyle.Bottom, Text = "Button 2" })
        {

            btn1.Click += delegate
            {
                form.Text = "Button 1 clicked";
                if (grid.CurrentRow != null)
                {
                    form.Text += ": " + ((Person)grid.CurrentRow.DataBoundItem).Name;
                }
            };
            btn2.Click += delegate
            {
                form.Text = "Button 2 clicked";
                if (grid.CurrentRow != null)
                {
                    form.Text += ": " + ((Person)grid.CurrentRow.DataBoundItem).Name;
                }
            };
            form.Controls.Add(btn1);
            form.Controls.Add(btn2);
            form.Controls.Add(grid);
            var data = new BindingList<Person>
            {
                new Person { Name = "Fred", EyeColor = "green"},
                new Person { Name = "Barney", EyeColor = "brown"},
                new Person { Name = "Wilma", EyeColor = "blue"},
                new Person { Name = "Betty", EyeColor = "blue"},
            };
            grid.DataSource = data;
            Application.Run(form);
        }
    }
}

有其他处理点击事件的方法,而且通常大部分都是通过设计师来完成的,而不是像这样(但在片段中很难显示设计师代码)。


但是,我应该使用哪个事件来获取CurrentRow?另外,我忘了提到,datagrid上有2个按钮,我如何知道单击的按钮是“编辑”还是“删除”? - Edwin
通过将不同的按钮连接到不同的事件处理程序... 如果意图相同,通常只应重用处理程序。 - Marc Gravell
我正在使用数据绑定,意味着我不知道我的表格将有多少行。你能给我一个指针,告诉我如何在通过.DataSource获取表格数据时挂接事件吗? - Edwin

0
你要找的事件是 CellClick 事件 - 对于 DataGridViewButtonColumn,你实际上不会像在表单上的其他按钮一样将事件处理程序与特定按钮关联。
通过单元格点击事件返回的事件参数,你可以确定单击发生在哪一行和哪一列,从而确定你想要执行的操作。
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{        
    DataGridViewButton cell = (DataGridViewButtonCell)
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];

    // Any additional logic you want
}

除此之外,我认为你会从退一步并思考winforms和webforms编码范例之间的差异中受益匪浅。

使用webforms时,你编写代码的方式很大程度上受到无状态的影响。但是在winforms中不是这样的,你有状态,并且可以在需要了解控件信息时访问大多数控件。

因此,像在DataGridView中检索当前选定单元格这样的信息,在winforms中是微不足道的。

此外,在大多数情况下,使用winforms时,你不需要特定的按钮来编辑或删除 - 你可以直接在网格中进行编辑,并使用内置的删除功能(选择行并按删除键)。

一个帮助你克服一些难点的好地方可能是DataGridView FAQ。它是学习DataGridView的绝佳资源。


谢谢提供信息。现在我感觉自己的问题有点傻。这对我帮助很大,谢谢! - Edwin
不客气 - 这并不是一个愚蠢的问题。我自己也是从winforms世界转向webforms,遇到了很多相同但相反的问题。很高兴我能帮到你。 - David Hall

0

DataGridView.CurrentRow可以获取选中的行。这是您需要的吗?


请看我的下面评论。我仍然不知道应该在哪个事件中检查该属性... - Edwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接