我是这个自定义 datagridview 列机制的新手。我想在 datagridview 中有一个组合框,它允许用户选择不同的线条样式(使用 DashStyle)。我发现的教程要么不适用于组合框,要么不使用绘图。
我已经可以通过覆盖 OnDrawItem() 来制作一个可以工作的自定义独立组合框,使用这里的代码
但我无法制作自定义 datagridview 组合框列。
- 我希望组合框单元的值返回 DashStyle。
- 我也无法在表单加载时显示绘制的项目。将默认启动值设置为 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; }
}
}
我很感激任何关于我做错了什么以及它是如何工作的信息......