0

我有一个设计问题,当您希望根据该单元格中的信息类型在用户单击 DataGridView 中的单元格时发生不同的操作时,最好的方法是什么。

想象以下场景。有一个包裹递送系统,其中一个屏幕显示当前安排的所有递送的列表。列可能包括:

  • 交货编号
  • 顾客号码
  • 客户交货地点
  • 主要联系人
  • 交货单收据

如果用户单击单元格,则操作应该根据列的不同而有所不同。例如,如果用户单击“客户交付位置”,它可能会打开一个交付位置窗口,允许他们查看/编辑位置详细信息。如果用户点击“Delivery Order Receipt”,它可能会打开一个显示订单收据的 PDF 窗口。

执行此操作的简单方法是对 CellClick 事件执行 If 语句。伪代码:

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

这对我来说似乎有点草率。特别是如果在某个时间点需要扩展程序以包含独特的右键单击操作或类似的东西。那么代码基本上必须被复制。有更好的方法吗?如果有一个类(可能是 ColumnActionType)来定义哪些操作应该与列相关联呢?

4

3 回答 3

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;
    }
}

dgv手头在哪里DataGridView。我把它放在CellDoubleClick事件中,但你可以把它放在任何使用 的事件中DataGridViewCellEventArgs,或者实际上任何你可以访问当前选定列的事件中。

于 2013-06-14T14:46:47.387 回答
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 中的一列,虚线延续线是对该单击事件的响应。

于 2013-06-12T16:42:56.273 回答
-1

我认为使用 switch 语句会更好

switch (column) {
   case "Delivery Order Receipt":
      LoadPDF();
      break;
   case "Customer Delivery Location":
      LaunchDeliveryWindow();
      break;
   default:
      break;
   }
于 2013-06-12T16:40:35.760 回答