C# 如何使用.NET Windows窗体中的实体框架向DataGridView添加自定义按钮

C# 如何使用.NET Windows窗体中的实体框架向DataGridView添加自定义按钮,c#,.net,entity-framework,datagridview,datasource,C#,.net,Entity Framework,Datagridview,Datasource,我正在开发一个.NET Windows窗体应用程序。坦率地说,我是.NETWindows窗体的绝对初学者。但我是ASP.NET开发人员。我正在进行我的第一个windows窗体项目。现在我在使用实体框架将数据绑定到DataGridView时遇到了问题。我想添加两个自定义按钮列。但我不知道怎么做,因为我是Windows窗体控件的绝对初学者 我的代码如下: RestaurantContext context = new RestaurantContext();

我正在开发一个.NET Windows窗体应用程序。坦率地说,我是.NETWindows窗体的绝对初学者。但我是ASP.NET开发人员。我正在进行我的第一个windows窗体项目。现在我在使用实体框架将数据绑定到DataGridView时遇到了问题。我想添加两个自定义按钮列。但我不知道怎么做,因为我是Windows窗体控件的绝对初学者

我的代码如下:

            RestaurantContext context = new RestaurantContext();
            var dbFoods = context.Foods;
            List<FoodMenuRow> rows = new List<FoodMenuRow>();
            foreach(var food in dbFoods)
            {
                FoodMenuRow row = new FoodMenuRow
                {
                    FoodId = food.Id,
                    FoodEnName = food.EnName,
                    FoodMmName = food.MmName,
                    IsAvailable = food.Available
                };
                rows.Add(row);
            }

            dataGridFoodMenu.DataSource = rows; 
当我运行代码时,我得到如下结果:


但是我想在末尾添加两个额外的列。两个添加的列将分别包含一个按钮。然后我为每个按钮设置事件。按钮类似于“编辑”和“删除”。他们的逻辑将是如此复杂。我不想直接从数据库绑定。我只想与对象绑定。

发布的代码看起来很奇怪,因为它似乎在制作一个不需要的食物列表。遵循代码。。。正在从RestaurantContex获取数据,不管是什么。变量
dbFoods
显然是这些食品的列表或数据表。很难说返回什么类型的结构。不管它是什么,代码都会在这个列表/表中循环,并创建一个新的
FoodMenuRow
对象,并设置相应的属性。然后将此
FoodMenuRow
添加到
rows
列表中。这看起来没有必要,因为您可能会将
dbFoods
本身用作
数据源
datagridfoodmens
。填充
列表后,它将作为
数据源
添加到
dataGridFoodMenu

由于您描述的“编辑”和“删除”两个按钮实际上不是
gatagridfoodmens
中数据的一部分,您可以在填充网格后添加这些按钮列,如下所示

DataGridViewButtonColumn buttonColEdit = new DataGridViewButtonColumn();
buttonColEdit.Name = "Edit";
buttonColEdit.Text = "Edit";
buttonColEdit.UseColumnTextForButtonValue = true;
DataGridViewButtonColumn buttonColDelete = new DataGridViewButtonColumn();
buttonColDelete.Name = "Delete";
buttonColDelete.Text = "Delete";
buttonColDelete.UseColumnTextForButtonValue = true;

dataGridFoodMenu.Columns.Add(buttonColEdit);
dataGridFoodMenu.Columns.Add(buttonColDelete);
添加的按钮应显示如下所示

DataGridViewButtonColumn buttonColEdit = new DataGridViewButtonColumn();
buttonColEdit.Name = "Edit";
buttonColEdit.Text = "Edit";
buttonColEdit.UseColumnTextForButtonValue = true;
DataGridViewButtonColumn buttonColDelete = new DataGridViewButtonColumn();
buttonColDelete.Name = "Delete";
buttonColDelete.Text = "Delete";
buttonColDelete.UseColumnTextForButtonValue = true;

dataGridFoodMenu.Columns.Add(buttonColEdit);
dataGridFoodMenu.Columns.Add(buttonColDelete);

将按钮添加到
dataGridFoodMenu
后,唯一剩下的就是在单击按钮时进行捕获。
dataGridFoodMenu
事件
CellContentClick
是一个允许您在单击这些按钮时捕获的事件。查看上图,“编辑”列位于第4列,“删除”列位于第5列。当触发
CellContentClick
事件时,可以检查是否单击了其中一个按钮列,并执行必要的“编辑”或“删除”

private void dataGridFoodMenu_CellContentClick(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 4) { 
    MessageBox.Show("EDIT button clicked at row: " + e.RowIndex);
  }
  else {
    if (e.ColumnIndex == 5) {
      MessageBox.Show("DELETE button clicked at row: " + e.RowIndex);
    }
    else {
      // buttons not clicked - ignoring
      //MessageBox.Show("Button cells were not clicked -- row: " + e.RowIndex + " Column: " + e.ColumnIndex);
    }
  }
}
我希望这能有所帮助