0

このカスタム datagridview 列メカニズムは初めてです。ユーザーが(DashStyleを使用して)さまざまな線のスタイルを選択できるようにするデータグリッドビューにコンボボックスが必要です。私が見つけたチュートリアルは、コンボボックス用ではないか、描画を使用していません。

こちらのコードを使用して、OnDrawItem() をオーバーライドすることで、機能するカスタム スタンドアロン ComboBox を既に作成できます。

しかし、カスタムの 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 に答える