我是这个自定义datagridview列机制的新手。我想在datagridview中有一个组合框,允许用户选择不同的线条样式(使用DashStyle)。我发现的教程要么不是组合框,要么不使用绘图。
我已经可以通过使用代码here
覆盖OnDrawItem()来创建一个可用的自定义独立ComboBox但我在制作自定义datagridview组合框列时遇到问题。
这是我到目前为止的代码,基于网络上的其他示例:
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; }
}
}
我感谢任何关于我做错了什么以及它如何运作的信息......
答案 0 :(得分:0)
创建一个方法,该方法将字符串“solid”并返回DashStyle.Solid
private DashStyle GetDashStyle(string style){
switch(style)
{
case "Solid":
return DashStyle.Solid;
}
}