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

Wai*_*ein -1 .net c# entity-framework datasource datagridview

我正在开发一个 .NET Windows 窗体应用程序。坦率地说,我绝对是 .NET windows 窗体的初学者。但我是 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; 
Run Code Online (Sandbox Code Playgroud)

如您所见,我从数据库加载数据,然后将值分配给对象 FoodMenuRow 以绑定数据。因为我不想直接绑定到EF的Entity。

这是 FoodMenuRow 类的定义

 public class FoodMenuRow
    {
        public int FoodId { get; set; }
        public string FoodMmName { get; set; }
        public string FoodEnName { get; set; }
        public bool IsAvailable { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

当我运行我的代码时,我得到了这样的东西:

在此处输入图片说明

但我想在最后添加两个额外的列。添加的两个列都将包含一个按钮。然后我为每个按钮设置事件。诸如“编辑”和“删除”之类的按钮。他们的逻辑会很复杂。我不想直接从数据库绑定。我只想绑定对象。

Joh*_*hnG 5

发布的代码看起来很奇怪,因为它似乎在不需要时列出食品清单。遵循代码......从RestaurantContex任何可能的数据中获取数据。变量dbFoods显然是这些食品的列表或数据表。很难说返回的是什么类型的结构。不管它是什么,代码都会遍历这个列表/表格并创建一个FoodMenuRow具有适当属性集的新对象。然后将FoodMenuRow其添加到rows列表中。这看起来没有必要,因为您似乎可以将dbFoods其用作DataSourceto dataGridFoodMenu。后rows列表填充它添加为DataSourcedataGridFoodMenu

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

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);
Run Code Online (Sandbox Code Playgroud)

添加的按钮应如下所示。

在此处输入图片说明

将按钮添加到按钮后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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可能会有所帮助。