2017-03-18 17 views
-1

我正在開發.NET Windows窗體應用程序。坦率地說,我絕對是.NET窗體的初學者。但我是ASP.NET開發人員。我在我的第一個窗體項目上。現在我遇到了使用實體框架將數據綁定到DataGridView的問題。我想添加兩個自定義按鈕列。但我不知道該怎麼做,因爲我絕對是Windows Forms控件的初學者。如何使用.NET中的實體框架向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; } 
    } 

當我運行我的代碼,我得到了這樣的事情:

enter image description here

但我想在末尾添加兩個額外列。兩個添加的列都會包含一個按鈕。然後我爲每個按鈕設置事件。按鈕像「編輯」和「刪除」。他們的邏輯將如此複雜。我不想直接從數據庫中綁定。我只想綁定對象。

回答

2

發佈的代碼看起來很奇怪,因爲它似乎在製作食物項目列表時並不需要。遵循代碼...從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); 

添加的按鈕應顯示如下。

enter image description here

一旦按鈕已被添加到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); 
    } 
    } 
} 

我希望這可能有所幫助。