自定义DataGridViewColumn的问题 我自定义了一个可编辑的DataGridViewComboBoxColumn,但发现了一个问题,我创建了两列自定义控件列,然后我给其中一列绑定数据,可奇怪的是既然两列都会有数据。调试后发现,DataGridViewComboBoxEditingControl类(就是编辑时候显示的控件),只创建了一次,按理应该是每个单元格创建一次的呀。而且我也没办法控制它什么时候创建,好像是系统自动创建的。请问这是怎么回事?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DataGridViewComboBoxColumn列是怎么加的? 就 new 两个列 添加进DataGridView啊 DataGridViewEditComboBoxColumn dgvc = new DataGridViewEditComboBoxColumn(); dgvc.HeaderText = "列1"; DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("num1")); DataRow dr = dt.NewRow(); dr[0] = 1; dt.Rows.Add(dr); dgvc.DataSource = dt; dgvc.DisplayMember = "num1"; dgvc.ValueMember = "num1"; dataGridView1.Columns.Add(dgvc); dgvc = new DataGridViewEditComboBoxColumn(); dgvc.HeaderText = "列2"; dataGridView1.Columns.Add(dgvc);就是这样绑定的 因为定义了DataGridViewComboBoxColumn相同的控件的原因。 其实我没有用相同名称,我只是为了描述方便才用DataGridViewComboBoxColumn 你可以将第二个列的DataSource设置为null试试 说的不错!var c1 = new DataGridViewEditComboBoxColumn();var c2 = new DataGridViewEditComboBoxColumn();c1.HeaderText = "列1";c2.HeaderText = "列2";dataGridView1.Columns.Add(c1);dataGridView1.Columns.Add(c2); 我调试过了,主要原因就是DataGridViewEditComboBoxEditingControl只创建了一次。按理应该是每个单元格创建一次的 那问题是出在 DataGridViewEditComboBoxEditingControl 里面的吧! DataGridViewEditComboBoxEditingControl 你说这个只触发一次是什么意思?你知道这个到底是啥意思不?相信你应该是在editingcontrolshowing事件中使用的吧 他是表示当前正在编辑的控件 你说怎么可能一下子触发多次呢???也许是我没理解你说的意思! 我把代码发出来吧!using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Data;using System.Drawing;public class DataGridViewEditComboBoxColumn : DataGridViewColumn{ /// <summary> /// 初始化 /// </summary> public DataGridViewEditComboBoxColumn() : base(new DataGridViewEditComboBocCell()) { } /// <summary> /// 获取或设置用于创建新单元格的模板。 /// </summary> public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { // Ensure that the cell used for the template is a DataGridCell. if (value != null && !value.GetType().IsAssignableFrom(typeof(DataGridViewEditComboBocCell))) { throw new InvalidCastException("Must be a DataGridCell"); } base.CellTemplate = value; } }}public class DataGridViewEditComboBocCell : DataGridViewTextBoxCell{ public DataGridViewEditComboBocCell() : base() { } /// <summary> /// 附加并初始化寄宿的编辑控件。 /// </summary> /// <param name="rowIndex"></param> /// <param name="initialFormattedValue"></param> /// <param name="dataGridViewCellStyle"></param> public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { // Set the value of the editing control to the current cell value. base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); DataGridViewEditComboBoxEditingControl ctl = DataGridView.EditingControl as DataGridViewEditComboBoxEditingControl; ctl.Text = (string)this.Value; } /// <summary> /// 编辑时的类型 /// </summary> public override Type EditType { get { // Return the type of the editing contol that DataGridCell uses. return typeof(DataGridViewEditComboBoxEditingControl); } } /// <summary> /// 值类型 /// </summary> public override Type ValueType { get { // Return the type of the value that DataGridCell contains. return typeof(string); } } /// <summary> /// 默认值 /// </summary> public override object DefaultNewRowValue { get { // Use the current date and time as the default value. return ""; } } public override object Clone() { DataGridViewEditComboBocCell cell = new DataGridViewEditComboBocCell(); return cell; }}public class DataGridViewEditComboBoxEditingControl : ComboBox, IDataGridViewEditingControl{ private DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public DataGridViewEditComboBoxEditingControl() { } // 摘要: // 获取或设置包含单元格的 System.Windows.Forms.DataGridView。 public DataGridView EditingControlDataGridView { get { return this.dataGridView; } set { this.dataGridView = value; } } // // 摘要: // 获取或设置编辑器正在修改的单元格的格式化值。 public object EditingControlFormattedValue { get { return this.GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting); } set { string strA = value as string; if (strA != null) { this.Text = strA; } } } // // 摘要: // 获取或设置该承载单元格的父行的索引。 // // 返回结果: // 包含该单元格的行的索引,如果没有父行,则为 -1。 public int EditingControlRowIndex { get { return this.rowIndex; } set { this.rowIndex = value; } } // // 摘要: // 获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。 // // 返回结果: // 如果控件的值与单元格的值不同,则为 true;否则为 false。 public bool EditingControlValueChanged { get { return this.valueChanged; } set { this.valueChanged = value; } } // // 摘要: // 获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。 // // 返回结果: // 一个 System.Windows.Forms.Cursor,表示用于编辑面板的鼠标指针。 public Cursor EditingPanelCursor { get { return base.Cursor; } } // // 摘要: // 获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。 // // 返回结果: // 如果需要重新定位单元格内容,则为 true;否则为 false。 public bool RepositionEditingControlOnValueChange { get { return false; } } // 摘要: // 更改控件的用户界面 (UI),使之与指定单元格样式一致。 // // 参数: // dataGridViewCellStyle: // 要用作用户界面的模型的 System.Windows.Forms.DataGridViewCellStyle。 public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; if (dataGridViewCellStyle.BackColor.A < 0xff) { Color color = Color.FromArgb(0xff, dataGridViewCellStyle.BackColor); this.BackColor = color; this.dataGridView.EditingPanel.BackColor = color; } else { this.BackColor = dataGridViewCellStyle.BackColor; } this.ForeColor = dataGridViewCellStyle.ForeColor; } // // 摘要: // 确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。 public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey) { if (((((keyData & Keys.KeyCode) != Keys.Down) && ((keyData & Keys.KeyCode) != Keys.Up)) && (((keyData & Keys.KeyCode) != Keys.Escape))) && ((keyData & Keys.KeyCode) != Keys.Return)) { return !dataGridViewWantsInputKey; } return true; } // // 摘要: // 检索单元格的格式化值。 public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) { return this.Text; } // // 摘要: // 准备当前选中的单元格以进行编辑。 // // 参数: // selectAll: // 为 true,则选择单元格的全部内容;否则为 false。 public void PrepareEditingControlForEdit(bool selectAll) { } protected override void OnTextChanged(EventArgs e) { this.valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnTextChanged(e); } protected override void OnSelectedIndexChanged(EventArgs e) { this.valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnTextChanged(e); }} 我觉得应该是在DataGridViewEditComboBocCell printDialog1的问题 dll pdb 程序“F:\Projects\Email\Email\obj\Debug\Email.exe”不包含适合于入口点的静态“Main”方法 关于字符串 数组 出个题了,功力不足做不出来,算法问题噢,聪明的试试看。 如何在一个固定时间来执行程序? 在類裡寫“~”是什麼意思啊? 最有效的方法防止.NET执行程序被反汇编出源代码的问题 c#datagridview里如何直接双击里面单元格直接修改然后同时保存进数据库 有没有指定文件夹的浏览打开方式? 数据改变事件? C#怎么实现C语言memmove的功能
dgvc.HeaderText = "列1";
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("num1"));
DataRow dr = dt.NewRow();
dr[0] = 1;
dt.Rows.Add(dr);
dgvc.DataSource = dt;
dgvc.DisplayMember = "num1";
dgvc.ValueMember = "num1";
dataGridView1.Columns.Add(dgvc);
dgvc = new DataGridViewEditComboBoxColumn();
dgvc.HeaderText = "列2";
dataGridView1.Columns.Add(dgvc);
就是这样绑定的
说的不错!var c1 = new DataGridViewEditComboBoxColumn();
var c2 = new DataGridViewEditComboBoxColumn();c1.HeaderText = "列1";
c2.HeaderText = "列2";dataGridView1.Columns.Add(c1);
dataGridView1.Columns.Add(c2);
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Drawing;public class DataGridViewEditComboBoxColumn : DataGridViewColumn
{
/// <summary>
/// 初始化
/// </summary>
public DataGridViewEditComboBoxColumn()
: base(new DataGridViewEditComboBocCell())
{
} /// <summary>
/// 获取或设置用于创建新单元格的模板。
/// </summary>
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a DataGridCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(DataGridViewEditComboBocCell)))
{
throw new InvalidCastException("Must be a DataGridCell");
}
base.CellTemplate = value;
}
}
}
public class DataGridViewEditComboBocCell : DataGridViewTextBoxCell
{
public DataGridViewEditComboBocCell()
: base()
{ } /// <summary>
/// 附加并初始化寄宿的编辑控件。
/// </summary>
/// <param name="rowIndex"></param>
/// <param name="initialFormattedValue"></param>
/// <param name="dataGridViewCellStyle"></param>
public override void InitializeEditingControl(int rowIndex, object
initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
// Set the value of the editing control to the current cell value.
base.InitializeEditingControl(rowIndex, initialFormattedValue,
dataGridViewCellStyle); DataGridViewEditComboBoxEditingControl ctl =
DataGridView.EditingControl as DataGridViewEditComboBoxEditingControl;
ctl.Text = (string)this.Value;
} /// <summary>
/// 编辑时的类型
/// </summary>
public override Type EditType
{
get
{
// Return the type of the editing contol that DataGridCell uses.
return typeof(DataGridViewEditComboBoxEditingControl);
}
} /// <summary>
/// 值类型
/// </summary>
public override Type ValueType
{
get
{
// Return the type of the value that DataGridCell contains.
return typeof(string);
}
}
/// <summary>
/// 默认值
/// </summary>
public override object DefaultNewRowValue
{
get
{
// Use the current date and time as the default value.
return "";
}
}
public override object Clone()
{
DataGridViewEditComboBocCell cell = new DataGridViewEditComboBocCell();
return cell;
}
}
public class DataGridViewEditComboBoxEditingControl : ComboBox, IDataGridViewEditingControl
{
private DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public DataGridViewEditComboBoxEditingControl()
{
}
// 摘要:
// 获取或设置包含单元格的 System.Windows.Forms.DataGridView。
public DataGridView EditingControlDataGridView
{
get
{
return this.dataGridView;
}
set
{
this.dataGridView = value;
}
}
//
// 摘要:
// 获取或设置编辑器正在修改的单元格的格式化值。
public object EditingControlFormattedValue
{
get
{
return this.GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
}
set
{
string strA = value as string;
if (strA != null)
{
this.Text = strA;
}
}
}
//
// 摘要:
// 获取或设置该承载单元格的父行的索引。
//
// 返回结果:
// 包含该单元格的行的索引,如果没有父行,则为 -1。
public int EditingControlRowIndex
{
get
{
return this.rowIndex;
}
set
{
this.rowIndex = value;
}
}
//
// 摘要:
// 获取或设置一个值,该值指示编辑控件的值是否与承载单元格的值不同。
//
// 返回结果:
// 如果控件的值与单元格的值不同,则为 true;否则为 false。
public bool EditingControlValueChanged
{
get
{
return this.valueChanged;
}
set
{
this.valueChanged = value;
}
}
//
// 摘要:
// 获取当鼠标指针位于 System.Windows.Forms.DataGridView.EditingPanel 上方但不位于编辑控件上方时所使用的光标。
//
// 返回结果:
// 一个 System.Windows.Forms.Cursor,表示用于编辑面板的鼠标指针。
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
//
// 摘要:
// 获取或设置一个值,该值指示每当值更改时,是否需要重新定位单元格的内容。
//
// 返回结果:
// 如果需要重新定位单元格内容,则为 true;否则为 false。
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
} // 摘要:
// 更改控件的用户界面 (UI),使之与指定单元格样式一致。
//
// 参数:
// dataGridViewCellStyle:
// 要用作用户界面的模型的 System.Windows.Forms.DataGridViewCellStyle。
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
if (dataGridViewCellStyle.BackColor.A < 0xff)
{
Color color = Color.FromArgb(0xff, dataGridViewCellStyle.BackColor);
this.BackColor = color;
this.dataGridView.EditingPanel.BackColor = color;
}
else
{
this.BackColor = dataGridViewCellStyle.BackColor;
}
this.ForeColor = dataGridViewCellStyle.ForeColor;
}
//
// 摘要:
// 确定指定的键是应由编辑控件处理的常规输入键,还是应由 System.Windows.Forms.DataGridView 处理的特殊键。
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
{
if (((((keyData & Keys.KeyCode) != Keys.Down) && ((keyData & Keys.KeyCode) != Keys.Up))
&& (((keyData & Keys.KeyCode) != Keys.Escape))) &&
((keyData & Keys.KeyCode) != Keys.Return))
{
return !dataGridViewWantsInputKey;
}
return true;
}
//
// 摘要:
// 检索单元格的格式化值。
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.Text;
}
//
// 摘要:
// 准备当前选中的单元格以进行编辑。
//
// 参数:
// selectAll:
// 为 true,则选择单元格的全部内容;否则为 false。
public void PrepareEditingControlForEdit(bool selectAll)
{ } protected override void OnTextChanged(EventArgs e)
{
this.valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
protected override void OnSelectedIndexChanged(EventArgs e)
{
this.valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
}