我正在尝试创建一个使用Radiobuttons托管的DataGridView列.我一直关注
this MSDN文章.
虽然我已经从教程中更改了代码来编写自己的类,但它并没有按预期工作.事情是我不完全确定我缺少什么.编译时没有错误.但它显示为CheckBoxes而不是Radiobuttons.
我已经附加了Visual Studio项目here.对于那些不确定下载未知附件的人,这里有我写的3个类.
RadiobuttonColumn类.它继承了DataGridViewColumn类.
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { class RadiobuttonColumn : DataGridViewColumn { public RadiobuttonColumn() : base(new RadiobuttonCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { if (value != null && !value.GetType().IsAssignableFrom(typeof(RadiobuttonCell))) { throw new InvalidCastException("Must be a RadiobuttonCell"); } } } } }
UPDATED RadiobuttonCell类继承DataGridViewCell类.
using System; using System.Windows.Forms; using System.Drawing; namespace DataGridView_Radiobutton_column { public class RadiobuttonCell : DataGridViewCell { public RadiobuttonCell() : base() { } public override void InitializeEditingControl(int rowIndex,object initialFormattedValue,DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex,initialFormattedValue,dataGridViewCellStyle); RadiobuttonEditingControl rdb = DataGridView.EditingControl as RadiobuttonEditingControl; if (this.Value == null) { rdb.Checked = false; } else { rdb.Checked = (Boolean)this.Value; } } public override Type EditType { get { return typeof(RadiobuttonEditingControl); } } public override Type ValueType { get { return typeof(Boolean); } } public override object DefaultNewRowValue { get { return false; } } protected override void Paint(system.drawing.graphics graphics,System.Drawing.Rectangle clipBounds,System.Drawing.Rectangle cellBounds,int rowIndex,DataGridViewElementStates cellState,object value,object formattedValue,string errorText,DataGridViewCellStyle cellStyle,DataGridViewAdvancedBorderStyle advancedBorderStyle,DataGridViewPaintParts paintParts) { base.Paint(graphics,clipBounds,cellBounds,rowIndex,cellState,value,formattedValue,errorText,cellStyle,advancedBorderStyle,paintParts); Rectangle recTradioButton = default(Rectangle); recTradioButton.Width = 14; recTradioButton.Height = 14; recTradioButton.X = cellBounds.X + (cellBounds.Width - recTradioButton.Width) / 2; recTradioButton.Y = cellBounds.Y + (cellBounds.Height - recTradioButton.Height) / 2; ControlPaint.DrawRadioButton(graphics,recTradioButton,ButtonState.normal); } } }
RadiobuttonEditingControl类继承RadioButton类并实现IDataGridViewEditingControl接口的方法.
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { class RadiobuttonEditingControl : RadioButton,IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public RadiobuttonEditingControl() { this.Checked = false; } public object EditingControlFormattedValue { get { return this.Checked = true; } set { this.Checked = false; } } public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } public void ApplyCellStyletoEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { } public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } public bool EditingControlWantsInputKey(Keys key,bool dataGridViewWantsInputKey) { switch (key & Keys.KeyCode) { case Keys.Space: return true; default: return !dataGridViewWantsInputKey; } } public void PrepareEditingControlForEdit(bool selectAll) { } public bool RepositionEditingControlOnValueChange { get { return false; } } public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnCheckedChanged(EventArgs eventArgs) { valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.Checked = false; } } }
如果有人可以看看这个并指出我在正确的方向上应该在代码中做些什么改变,我将不胜感激.
谢谢.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。