【问题标题】:How to add custom buttons to DataGridView with Entity Framework in .NET Windows Forms如何在 .NET Windows 窗体中使用实体框架将自定义按钮添加到 DataGridView
【发布时间】:2017-03-18 16:32:29
【问题描述】:

我正在开发一个 .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; 

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

这是 FoodMenuRow 类的定义

 public class FoodMenuRow
    {
        public int FoodId { get; set; }
        public string FoodMmName { get; set; }
        public string FoodEnName { get; set; }
        public bool IsAvailable { get; set; }
    }

当我运行我的代码时,我得到了这样的结果:

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

【问题讨论】:

    标签: c# .net entity-framework datagridview datasource


    【解决方案1】:

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

    由于您描述的“编辑”和“删除”这两个按钮实际上并不是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);
    

    添加的按钮应如下所示。

    将按钮添加到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);
        }
      }
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多