2013-06-12 22 views
0

我有一個設計問題,當您想要在用戶單擊DataGridView中的單元格時發生不同的操作時,基於哪種類型的信息在那個牢房裏。C# - DataGridView - 具有獨特的基於內容的CellClick事件

想象下面的情景。有一個包裹交付系統,其中一個屏幕顯示當前計劃的所有交付清單。列可能包括:

  • 交貨編號
  • 客戶編號
  • 客戶交貨地點
  • 主要聯繫人
  • 交貨訂單收據

如果用戶會點擊單元格中的作用應根據列的不同而有所不同。例如,如果用戶點擊「客戶配送地點」,則可能會打開一個配送地點窗口,允許他們查看/編輯地點詳情。如果用戶點擊「遞送訂單收據」,它可能會打開一個顯示訂單收據的PDF窗口。

執行此操作的簡單方法是在CellClick事件上執行If語句。僞代碼:

If (column = Delivery Order Receipt) 
{ 
    LoadPDF() 
} 
Else if (column = Customer Delivery Location) 
{ 
    LaunchDeliveryWindow() 
} 

這對我來說似乎有點草率。特別是如果在某個時間點,程序需要擴展以包含獨特的右鍵操作,或者沿着這些線路。然後代碼基本上必須被複制。有更好的方法嗎?有一個類,也許是ColumnActionType,它定義了什麼樣的動作應該與列相關聯呢?

+2

我想這取決於存在多少選擇。如果用鼠標左鍵點擊「Delivery Order Receipt」列僅產生一個動作,其他反應類似1:1,那麼您的方法並不錯。你可以把它封裝在一個類中,但是在某個時候,你仍然需要決定什麼是被點擊的,如何以及如何處理它。 – DonBoitnott

回答

1

在我看來,以下是體面的實施方式。特別是如果沒有很多列/動作。然而,DonBoitnott在評論中指出,這確實取決於情況。

private enum ActionType 
{ 
    CellRightClick, 
    CellDoubleClick 
    // add as you need them 
}  

private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex >= 0) 
    { 
     DataGridViewColumn selectedColumn = this.dgv[e.ColumnIndex, e.RowIndex].OwningColumn; 
     this.PerformActionOnColumn(ActionType.CellDoubleClick, selectedColumn.Name); 
    } 
} 

private void PerformActionOnColumn(ActionType action, string columnName) 
{ 
    switch (columnName) 
    { 
     case "col_One": 
      switch (action) 
      { 
       case ActionType.CellRightClick: 
        // right click actions for col_One 
        break; 

       case ActionType.CellDoubleClick: 
        // double click actions for col_One 
        break; 
      } 
      break; 

     case "col_Two": 
      switch (action) 
      { 
       case ActionType.CellRightClick: 
        // right click actions for col_Two 
        break; 

       case ActionType.CellDoubleClick: 
        // double click actions for col_Two 
        break; 
      } 
      break; 
    } 
} 

哪裏dgvDataGridView在眼前。我把它放在CellDoubleClick事件中,但是你可以在任何使用DataGridViewCellEventArgs的事件中,或者任何可以訪問當前選定列的事件中使用它。

-1

我認爲使用switch語句會更好

switch (column) { 
    case "Delivery Order Receipt": 
     LoadPDF(); 
     break; 
    case "Customer Delivery Location": 
     LaunchDeliveryWindow(); 
     break; 
    default: 
     break; 
    } 
+0

這個問題不涉及邏輯機制,而是設計原則。 – DonBoitnott

0
private void dgGridView_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == dgGridView.Columns["dgcCustomer"].Index && e.RowIndex >= 0) 
     { 
      DataGridViewRow selectedRow = dgGridView.Rows[e.RowIndex]; 
      . 
    . 
    . 
     } 
    } 

哪裏dgGridView是DataGridView的對象, 「dgcCustomer」 是在DataGridView虛線續行一列,是對該點擊事件的響應。

相關問題