想写一个DataGridViewComboColumn的派生类, 测试时总是出错: datagridViewComboCell值无效.
出错在哪一行也不知道. 只好请高手给看看了.代码比较长,不过基本是依照MSDN上的CalendarColumn范例改的. 没有什么特别之处. public class Cmb : ComboBox
{
// Methods
public Cmb();
}
public class CmbColumn : DataGridViewColumn
{
// Fields
private string mDataMember;
private object mDataSource;
private string mDisplayMember;
private string mValueMember; // Methods
public CmbColumn() : base(new CmbCell())
{
this.mDataSource = RuntimeHelpers.GetObjectValue(new object());
this.mValueMember = "";
this.mDisplayMember = "";
this.mDataMember = "";
} public override object Clone()
{
CmbColumn col = (CmbColumn) base.Clone();
col.DataSource = RuntimeHelpers.GetObjectValue(this.DataSource);
col.ValueMember = this.ValueMember;
col.DisplayMember = this.DisplayMember;
return col;
} // Properties
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if ((value != null) && !value.GetType().IsAssignableFrom(typeof(CmbCell)))
{
throw new InvalidCastException("Must be a CmbCell");
}
base.CellTemplate = value;
}
} public object DataSource
{
get
{
return this.mDataSource;
}
set
{
if (value != null)
{
this.mDataSource = RuntimeHelpers.GetObjectValue(value);
}
}
} public string DisplayMember
{
get
{
return this.mDisplayMember;
}
set
{
this.mDisplayMember = value;
}
} public string ValueMember
{
get
{
return this.mValueMember;
}
set
{
this.mValueMember = value;
}
}
}
public class CmbCell : DataGridViewComboBoxCell
{
// Methods
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, RuntimeHelpers.GetObjectValue(initialFormattedValue), dataGridViewCellStyle);
CmbEditingControl ctl = (CmbEditingControl) this.DataGridView.EditingControl;
CmbColumn col = (CmbColumn) this.OwningColumn;
if (this.Value != null)
{
ctl.Text = this.Value.ToString();
}
if (ctl != null)
{
ctl.DataSource = RuntimeHelpers.GetObjectValue(col.DataSource);
ctl.ValueMember = col.ValueMember;
ctl.DisplayMember = col.DisplayMember;
}
} // Properties
public override Type EditType
{
get
{
return typeof(CmbEditingControl);
}
}
}public class CmbEditingControl : Cmb, IDataGridViewEditingControl
{
// Fields
private DataGridView dataGridViewControl;
private int rowIndexNum;
private bool valueIsChanged; // Methods
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
} public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch ((keyData & Keys.KeyCode))
{
case Keys.Prior:
case Keys.Next:
case Keys.End:
case Keys.Home:
case Keys.Left:
case Keys.Up:
case Keys.Right:
case Keys.Down:
return true;
}
return false;
} public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.SelectedValue;
} protected override void OnSelectedValueChanged(EventArgs e)
{
this.valueIsChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnSelectedValueChanged(e);
} public void PrepareEditingControlForEdit(bool selectAll)
{
} // Properties
public DataGridView EditingControlDataGridView
{
get
{
return this.dataGridViewControl;
}
set
{
this.dataGridViewControl = value;
}
} public object EditingControlFormattedValue
{
get
{
return this.SelectedValue;
}
set
{
this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
}
} public int EditingControlRowIndex
{
get
{
return this.rowIndexNum;
}
set
{
this.rowIndexNum = value;
}
} public bool EditingControlValueChanged
{
get
{
return this.valueIsChanged;
}
set
{
this.valueIsChanged = value;
}
} public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
} public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
} public DataGridView System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
{
get
{
return this.dataGridViewControl;
}
set
{
this.dataGridViewControl = value;
}
} public object System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
{
get
{
return this.SelectedValue;
}
set
{
this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
}
} public int System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
{
get
{
return this.rowIndexNum;
}
set
{
this.rowIndexNum = value;
}
} public bool System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
{
get
{
return this.valueIsChanged;
}
set
{
this.valueIsChanged = value;
}
} public Cursor System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
{
get
{
return base.Cursor;
}
} public bool System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
}
出错在哪一行也不知道. 只好请高手给看看了.代码比较长,不过基本是依照MSDN上的CalendarColumn范例改的. 没有什么特别之处. public class Cmb : ComboBox
{
// Methods
public Cmb();
}
public class CmbColumn : DataGridViewColumn
{
// Fields
private string mDataMember;
private object mDataSource;
private string mDisplayMember;
private string mValueMember; // Methods
public CmbColumn() : base(new CmbCell())
{
this.mDataSource = RuntimeHelpers.GetObjectValue(new object());
this.mValueMember = "";
this.mDisplayMember = "";
this.mDataMember = "";
} public override object Clone()
{
CmbColumn col = (CmbColumn) base.Clone();
col.DataSource = RuntimeHelpers.GetObjectValue(this.DataSource);
col.ValueMember = this.ValueMember;
col.DisplayMember = this.DisplayMember;
return col;
} // Properties
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if ((value != null) && !value.GetType().IsAssignableFrom(typeof(CmbCell)))
{
throw new InvalidCastException("Must be a CmbCell");
}
base.CellTemplate = value;
}
} public object DataSource
{
get
{
return this.mDataSource;
}
set
{
if (value != null)
{
this.mDataSource = RuntimeHelpers.GetObjectValue(value);
}
}
} public string DisplayMember
{
get
{
return this.mDisplayMember;
}
set
{
this.mDisplayMember = value;
}
} public string ValueMember
{
get
{
return this.mValueMember;
}
set
{
this.mValueMember = value;
}
}
}
public class CmbCell : DataGridViewComboBoxCell
{
// Methods
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, RuntimeHelpers.GetObjectValue(initialFormattedValue), dataGridViewCellStyle);
CmbEditingControl ctl = (CmbEditingControl) this.DataGridView.EditingControl;
CmbColumn col = (CmbColumn) this.OwningColumn;
if (this.Value != null)
{
ctl.Text = this.Value.ToString();
}
if (ctl != null)
{
ctl.DataSource = RuntimeHelpers.GetObjectValue(col.DataSource);
ctl.ValueMember = col.ValueMember;
ctl.DisplayMember = col.DisplayMember;
}
} // Properties
public override Type EditType
{
get
{
return typeof(CmbEditingControl);
}
}
}public class CmbEditingControl : Cmb, IDataGridViewEditingControl
{
// Fields
private DataGridView dataGridViewControl;
private int rowIndexNum;
private bool valueIsChanged; // Methods
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
} public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
switch ((keyData & Keys.KeyCode))
{
case Keys.Prior:
case Keys.Next:
case Keys.End:
case Keys.Home:
case Keys.Left:
case Keys.Up:
case Keys.Right:
case Keys.Down:
return true;
}
return false;
} public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.SelectedValue;
} protected override void OnSelectedValueChanged(EventArgs e)
{
this.valueIsChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnSelectedValueChanged(e);
} public void PrepareEditingControlForEdit(bool selectAll)
{
} // Properties
public DataGridView EditingControlDataGridView
{
get
{
return this.dataGridViewControl;
}
set
{
this.dataGridViewControl = value;
}
} public object EditingControlFormattedValue
{
get
{
return this.SelectedValue;
}
set
{
this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
}
} public int EditingControlRowIndex
{
get
{
return this.rowIndexNum;
}
set
{
this.rowIndexNum = value;
}
} public bool EditingControlValueChanged
{
get
{
return this.valueIsChanged;
}
set
{
this.valueIsChanged = value;
}
} public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
} public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
} public DataGridView System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
{
get
{
return this.dataGridViewControl;
}
set
{
this.dataGridViewControl = value;
}
} public object System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
{
get
{
return this.SelectedValue;
}
set
{
this.SelectedValue = RuntimeHelpers.GetObjectValue(value);
}
} public int System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
{
get
{
return this.rowIndexNum;
}
set
{
this.rowIndexNum = value;
}
} public bool System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
{
get
{
return this.valueIsChanged;
}
set
{
this.valueIsChanged = value;
}
} public Cursor System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
{
get
{
return base.Cursor;
}
} public bool System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
}
http://www.cnblogs.com/luqingfei/archive/2007/06/22/691372.html
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{ }
ValueMember的值类型与表格的值DataPropertyName是否导致
測試用例中我把這列用datagridviewComboBoxColumn替換, DataSource,valuemember等屬性設置完全相同.不會出問題, 所以不是上述原因.問題應該還是出在派生類的代碼上.
能不能具体讲讲, IDataGridViewEditingControl底下的属性设定 有什么问题? 谢谢.