处理DataGridViewComboBoxCell中的SelectedIndexChanged事件处理程序

时间:2016-06-12 17:42:44

标签: c# winforms selectedindexchanged datagridviewcomboboxcell

我的派生类有两个相关问题。

我正在尝试添加SelectedIndexChanged事件处理程序。它当然被称为:

class DataGridViewColourComboBoxCell : DataGridViewComboBoxCell
{
    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
    {
        // Set the value of the editing control to the current cell value.
        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

        DataGridViewColourComboBoxEditingControl ctl = 
            DataGridView.EditingControl as DataGridViewColourComboBoxEditingControl;
        // Use the default row value when Value property is null.
        if (this.Value == null)
        {
            ctl.SelectedIndex = (int)this.DefaultNewRowValue;
        }
        else
        {
            ctl.SelectedItem = Find(this.Value.ToString());
            try
            {
                ctl.SelectedIndexChanged -= new EventHandler(SelectedIndexChanged);

            }
            catch { }
            ctl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
        }
    }
}

private void SelectedIndexChanged(object sender, EventArgs e)
{
    DataGridViewColourComboBoxEditingControl ctl = (DataGridViewColourComboBoxEditingControl)sender;
    MessageBox.Show(ctl.SelectedIndex.ToString());
}

但我有两个问题:

  1. 每次我选择网格中的另一个组合时,应用程序似乎都在捎带事件处理程序,因为每次我收到的弹出消息比以前多一个(1,然后是2,然后是3,依此类推)。我认为使用try / catch块会阻止这种情况。
  2. 我已经修复了第1项。我在错误的地方添加了事件处理程序。我在这里需要它:

    public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
    {
        public DataGridViewColourComboBoxEditingControl() : base()
        {
            DrawMode = DrawMode.OwnerDrawFixed;
    
        }
    
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            //base.OnDrawItem(e);
            //....
        }
    
        protected override void OnSelectedIndexChanged(EventArgs e)
        {
            MessageBox.Show(SelectedIndex.ToString());
    
            base.OnSelectedIndexChanged(e);
        }
    }
    
    1. 它并不像我想的那样完全开火。我只想知道用户何时从显示的下拉列表中选择了一个条目。目前,当将焦点设置到下一个单元格时,也会触发上述事件处理程序。
    2. 但第2项仍然是一个问题。事件只是单击另一个单元格导致事件触发(请注意,我已将网格设置为单击时编辑)。但是单击单元格无论如何都不会显示下拉列表。在这种情况下,我不希望它发射。它必须来自下拉列表中的选择。

      我见过这个:How to handle SelectedIndexChanged event for a ComboBox?

      但我不想在网格中做事。我想在派生类中做一些事情。基本上我想检测他们何时显示下拉列表并单击第一项。如果他们点击第一个项目,它应该显示一个表格(表现得像一个按钮)。

      更新

      我相信我可能找到了解决方案:

      public class DataGridViewColourComboBoxEditingControl : DataGridViewComboBoxEditingControl
      {
          public DataGridViewColourComboBoxEditingControl() : base()
          {
              DrawMode = DrawMode.OwnerDrawFixed;
          }
      
          protected override void OnDrawItem(DrawItemEventArgs e)
          {
              //base.OnDrawItem(e);
              //....
          }
      
          protected override void OnDropDownClosed(EventArgs e)
          {
              if(SelectedIndex == 0) // Display the pop up
                  MessageBox.Show("Display pop up colour dialog");
      
              base.OnDropDownClosed(e);
          }
      }
      

      我需要使用OnDropDownClosed。该解决方案的唯一问题是该单元格中已经选择了该条目。由于我希望组合中的第一个项目像按钮一样,因此想法是如果他们选择了它,它会显示一个对话框(他们选择一种不在组合中的不同颜色)并将其添加到组合中并选择它。目前,如果我在处理程序中手动添加SelectedIndex = 5;(我实际上选择了索引4),它首先闪烁索引4的单元格然后索引5.有意义吗?

0 个答案:

没有答案