0

我是这个自定义 datagridview 列机制的新手。我想在 datagridview 中有一个组合框,它允许用户选择不同的线条样式(使用 DashStyle)。我发现的教程要么不适用于组合框,要么不使用绘图。

我已经可以通过覆盖 OnDrawItem() 来制作一个可以工作的自定义独立组合框,使用这里的代码

但我无法制作自定义 datagridview 组合框列。

  1. 我希望组合框单元的值返回 DashStyle。
  2. 我也无法在表单加载时显示绘制的项目。将默认启动值设置为 Dashstyle.Solid 在组合框中写入“Solid”。当我点击它时,它会触发绘图项目......

这是我到目前为止的代码,基于网络上的其他示例:

public class CustomComboBoxColumn : DataGridViewComboBoxColumn
{
  public CustomComboBoxColumn()
  {
    CustomComboBoxCell cbc = new CustomComboBoxCell();
    this.CellTemplate = cbc;
  }
}

public class CustomComboBoxCell : DataGridViewComboBoxCell
{
  public CustomComboBoxCell()
  : base() { }

  public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
  {
    base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);

    var ctl = DataGridView.EditingControl as CustomComboBoxControl;

    if (this.Value == null)
      ctl.SelectedIndex = 0;
  }

  public override Type EditType
  {
    get { return typeof(CustomComboBoxControl); }
  }

  public override Type ValueType
  {
    get { return typeof(DashStyle); }
  }

  public override object DefaultNewRowValue
  {
    get { return DashStyle.Solid; }
  }

}


public class CustomComboBoxControl : MyComboBox, IDataGridViewEditingControl
{
  private int index_ = 0;
  private DataGridView dataGridView_ = null;
  private bool valueChanged_ = false;

  public CustomComboBoxControl() : base()
  {
    this.SelectedIndexChanged += new EventHandler(ComboBoxControl_SelectedIndexChanged);
    this.DrawMode = DrawMode.OwnerDrawVariable;
    this.DropDownStyle = ComboBoxStyle.DropDownList;
  }


  public void ComboBoxControl_SelectedIndexChanged(object sender, EventArgs e)
  {
    NotifyDataGridViewOfValueChange();
  }


  protected virtual void NotifyDataGridViewOfValueChange()
  {
    this.valueChanged_ = true;
    if (this.dataGridView_ != null)
    {
      this.dataGridView_.NotifyCurrentCellDirty(true);
    }
  }

  public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) {      }

  public DataGridView EditingControlDataGridView
  {
    get { return dataGridView_; }
    set { dataGridView_ = value; }
  }

  public object EditingControlFormattedValue
  {
    get { return base.SelectedValue; }
    set { base.SelectedValue = value; NotifyDataGridViewOfValueChange(); }
  }

  public int EditingControlRowIndex
  {
    get { return index_; }
    set { index_ = value; }
  }

  public bool EditingControlValueChanged
  {
    get { return valueChanged_; }
    set { valueChanged_ = value; }
  }

  public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
  {
    if (keyData == Keys.Return)
      return true;
    switch (keyData & Keys.KeyCode)
    {
      case Keys.Up:
      case Keys.Down:
        return true;
      default:
        return false;
    }
  }

  public Cursor EditingPanelCursor
  {
    get { return base.Cursor; }
  }

  public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
  {
    var val = EditingControlFormattedValue;
    if (val == null)
      val = DashStyle.Solid;
    return val.ToString();
  }

  public void PrepareEditingControlForEdit(bool selectAll) { }

  public bool RepositionEditingControlOnValueChange
  {
    get { return false; }
  }

}

我很感激任何关于我做错了什么以及它是如何工作的信息......

4

1 回答 1

0

创建一个采用字符串“solid”并返回 DashStyle.Solid 的方法

private DashStyle GetDashStyle(string style){
  switch(style)
   {
        case "Solid":
         return DashStyle.Solid;
   }
}
于 2012-07-18T22:58:31.270 回答