如何使用 .NET Windows Forms 中的 Entity Framework 向 DataGridView 添加自定义按钮
How to add custom buttons to DataGridView with Entity Framework in .NET Windows Forms
我正在开发 .NET Windows Forms 应用程序。坦率地说,我绝对是 .NET windows 表单的初学者。但我是 ASP.NET 开发人员。我正在进行我的第一个 windows 表单项目。现在我在使用 Entity Framework 将数据绑定到 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的Entity。
这是定义 if classFoodMenuRow
public class FoodMenuRow
{
public int FoodId { get; set; }
public string FoodMmName { get; set; }
public string FoodEnName { get; set; }
public bool IsAvailable { get; set; }
}
当我 运行 我的代码时,我得到了这样的东西:
但我想在末尾添加两个额外的列。两个添加的列都将包含一个按钮。然后我为每个按钮设置事件。类似 "Edit" 和 "Delete" 的按钮。他们的逻辑会这么复杂。我不想直接从数据库绑定。我只想绑定对象。
从某种意义上说,发布的代码看起来很奇怪,因为它似乎在没有必要的时候列出了一份食品清单。按照代码...正在从 RestaurantContex
获取数据,无论它是什么。变量 dbFoods
显然是这些食品的列表或数据 Table。很难说返回的是什么类型的结构。不管它是什么,代码循环遍历此 list/table 并创建一个具有适当属性集的新 FoodMenuRow
对象。然后这个 FoodMenuRow
被添加到 rows
列表中。这看起来没有必要,因为您似乎可以将 dbFoods
本身用作 DataSource
到 dataGridFoodMenu
。 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);
}
}
}
我希望这可能有所帮助。
我正在开发 .NET Windows Forms 应用程序。坦率地说,我绝对是 .NET windows 表单的初学者。但我是 ASP.NET 开发人员。我正在进行我的第一个 windows 表单项目。现在我在使用 Entity Framework 将数据绑定到 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的Entity。
这是定义 if classFoodMenuRow
public class FoodMenuRow
{
public int FoodId { get; set; }
public string FoodMmName { get; set; }
public string FoodEnName { get; set; }
public bool IsAvailable { get; set; }
}
当我 运行 我的代码时,我得到了这样的东西:
但我想在末尾添加两个额外的列。两个添加的列都将包含一个按钮。然后我为每个按钮设置事件。类似 "Edit" 和 "Delete" 的按钮。他们的逻辑会这么复杂。我不想直接从数据库绑定。我只想绑定对象。
从某种意义上说,发布的代码看起来很奇怪,因为它似乎在没有必要的时候列出了一份食品清单。按照代码...正在从 RestaurantContex
获取数据,无论它是什么。变量 dbFoods
显然是这些食品的列表或数据 Table。很难说返回的是什么类型的结构。不管它是什么,代码循环遍历此 list/table 并创建一个具有适当属性集的新 FoodMenuRow
对象。然后这个 FoodMenuRow
被添加到 rows
列表中。这看起来没有必要,因为您似乎可以将 dbFoods
本身用作 DataSource
到 dataGridFoodMenu
。 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);
}
}
}
我希望这可能有所帮助。