C# 处理自定义DataGridView列的调整大小事件
我已尝试实现自己的自定义DataGridView列。我使用以下代码完成了这项工作。从此MSDN页面借用和修改: 我遇到的难题是如何通知usercontrol ucFolderBrowser gridviewcolumn的大小已调整,需要相应地进行调整C# 处理自定义DataGridView列的调整大小事件,c#,.net,datagridview,resize,C#,.net,Datagridview,Resize,我已尝试实现自己的自定义DataGridView列。我使用以下代码完成了这项工作。从此MSDN页面借用和修改: 我遇到的难题是如何通知usercontrol ucFolderBrowser gridviewcolumn的大小已调整,需要相应地进行调整 class FolderGridViewColumn : DataGridViewColumn { public FolderGridViewColumn() : base(new FolderCell()) { }
class FolderGridViewColumn : DataGridViewColumn
{
public FolderGridViewColumn() : base(new FolderCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
// Ensure that the cell used for the template is a FolderCell.
if (value != null &&
!value.GetType().IsAssignableFrom(typeof(FolderCell)))
{
throw new InvalidCastException("Must be a FolderCell");
}
base.CellTemplate = value;
}
}
}
class FolderCell : DataGridViewTextBoxCell
{
public FolderCell() : base()
{
//this.Style.Format = ""; //Can set format
}
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
FolderEditingControl ctl = DataGridView.EditingControl as FolderEditingControl;
// Use the default row value when Value property is null.
if (this.Value == null)
{
ctl.Text = (string)this.DefaultNewRowValue;
}
else
{
ctl.Text = (string)this.Value;
}
}
public override Type EditType
{
get
{
// Return the type of the editing control that FolderCell uses.
return typeof(FolderEditingControl);
}
}
public override Type ValueType
{
get
{
// Return the type of the value that FolderBrowserCell contains.
return typeof(string);
}
}
public override object DefaultNewRowValue
{
get
{
//default value.
return string.Empty;
}
}
}
class FolderEditingControl : ucFolderBrowser, IDataGridViewEditingControl
{
DataGridView dataGridView;
private bool valueChanged = false;
int rowIndex;
public FolderEditingControl() { }
// Implements the IDataGridViewEditingControl.EditingControlFormattedValue
// property.
public object EditingControlFormattedValue
{
get
{
return this.Text;
}
set
{
this.Text = (string) value;
}
}
// Implements the
// IDataGridViewEditingControl.GetEditingControlFormattedValue method.
public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
{
return this.EditingControlFormattedValue;
}
// Implements the
// IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
{
this.Font = dataGridViewCellStyle.Font;
this.ForeColor = dataGridViewCellStyle.ForeColor;
this.BackColor = dataGridViewCellStyle.BackColor;
}
// Implements the IDataGridViewEditingControl.EditingControlRowIndex
// property.
public int EditingControlRowIndex
{
get
{
return rowIndex;
}
set
{
rowIndex = value;
}
}
// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey
// method.
public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
{
// Let the textbox handle the keys listed.
switch (key & Keys.KeyCode)
{
case Keys.Left:
case Keys.Right:
case Keys.Home:
case Keys.End:
default:
return !dataGridViewWantsInputKey;
}
}
// Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit
// method.
public void PrepareEditingControlForEdit(bool selectAll)
{
// No preparation needs to be done.
}
// Implements the IDataGridViewEditingControl
// .RepositionEditingControlOnValueChange property.
public bool RepositionEditingControlOnValueChange
{
get
{
return false;
}
}
// Implements the IDataGridViewEditingControl
// .EditingControlDataGridView property.
public DataGridView EditingControlDataGridView
{
get
{
return dataGridView;
}
set
{
dataGridView = value;
}
}
// Implements the IDataGridViewEditingControl
// .EditingControlValueChanged property.
public bool EditingControlValueChanged
{
get
{
return valueChanged;
}
set
{
valueChanged = value;
}
}
// Implements the IDataGridViewEditingControl
// .EditingPanelCursor property.
public Cursor EditingPanelCursor
{
get
{
return base.Cursor;
}
}
protected override void OnTextChanged(EventArgs e)
{
// Notify the DataGridView that the contents of the cell
// have changed.
valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
}
public partial class ucFolderBrowser : UserControl
{
public ucFolderBrowser()
{
InitializeComponent();
}
public override string Text
{
get
{
return txtPath.Text;
}
set
{
txtPath.Text = value;
}
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.txtPath = new System.Windows.Forms.TextBox();
this.btnBrowse = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// txtPath
//
this.txtPath.Location = new System.Drawing.Point(0, 0);
this.txtPath.Name = "txtPath";
this.txtPath.Size = new System.Drawing.Size(100, 20);
this.txtPath.TabIndex = 0;
//
// btnBrowse
//
this.btnBrowse.Location = new System.Drawing.Point(100, -1);
this.btnBrowse.Name = "btnBrowse";
this.btnBrowse.Size = new System.Drawing.Size(30, 21);
this.btnBrowse.TabIndex = 1;
this.btnBrowse.Text = "...";
this.btnBrowse.UseVisualStyleBackColor = true;
this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click);
//
// ucFolderBrowser
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.btnBrowse);
this.Controls.Add(this.txtPath);
this.Name = "ucFolderBrowser";
this.Size = new System.Drawing.Size(129, 20);
this.ResumeLayout(false);
this.PerformLayout();
}
}
class FolderGridViewColumn:DataGridViewColumn
{
公共FolderGridViewColumn():基(新FolderCell())
{
}
公共覆盖DataGridViewCell单元模板
{
得到
{
返回base.CellTemplate;
}
设置
{
//确保用于模板的单元格是FolderCell。
if(值!=null&&
!value.GetType().IsAssignableFrom(typeof(FolderCell)))
{
抛出新的InvalidCastException(“必须是FolderCell”);
}
base.CellTemplate=值;
}
}
}
类FolderCell:DataGridViewTextBoxCell
{
public FolderCell():base()
{
//this.Style.Format=”“;//可以设置格式
}
public override void initializeditingcontrol(int行索引、对象initialFormattedValue、DataGridViewCellStyle DataGridViewCellStyle)
{
initializeEdit控件(rowIndex、initialFormattedValue、dataGridViewCellStyle);
FolderEditingControl ctl=DataGridView.EditingControl作为FolderEditingControl;
//值属性为空时使用默认行值。
if(this.Value==null)
{
ctl.Text=(字符串)this.DefaultNewRowValue;
}
其他的
{
ctl.Text=(字符串)this.Value;
}
}
公共覆盖类型EditType
{
得到
{
//返回FolderCell使用的编辑控件的类型。
返回类型(FolderEdit控件);
}
}
公共重写类型ValueType
{
得到
{
//返回FolderBrowserCell包含的值的类型。
返回类型(字符串);
}
}
公共覆盖对象DefaultNewRowValue
{
得到
{
//默认值。
返回字符串。空;
}
}
}
类FolderEditingControl:ucFolderBrowser、IDataGridViewEditingControl
{
DataGridView DataGridView;
私有布尔值更改=false;
整数行索引;
公共FolderEditingControl(){}
//实现IDataGridViewEditingControl.EditingControlFormattedValue
//财产。
公共对象EditingControlFormattedValue
{
得到
{
返回此.Text;
}
设置
{
this.Text=(字符串)值;
}
}
//实现
//IDataGridViewEditingControl.GetEditingControlFormattedValue方法。
公共对象GetEditingControlFormattedValue(DataGridViewDataErrorContext上下文)
{
返回此.EditingControlFormattedValue;
}
//实现
//IDataGridViewEditingControl.ApplyCellStyleToEditingControl方法。
public void applycellstyletoediting控件(DataGridViewCellStyle DataGridViewCellStyle)
{
this.Font=dataGridViewCellStyle.Font;
this.ForeColor=dataGridViewCellStyle.ForeColor;
this.BackColor=dataGridViewCellStyle.BackColor;
}
//实现IDataGridViewEditingControl.EditingControlRowIndex
//财产。
公共整数编辑控制行索引
{
得到
{
返回行索引;
}
设置
{
行索引=值;
}
}
//实现IDataGridViewEditingControl.EditingControlWantInputKey
//方法。
公共bool编辑控制WANTINSPUTKEY(Keys key,bool DataGridViewWANTINSPUTKEY)
{
//让文本框处理列出的键。
开关(钥匙和钥匙。钥匙代码)
{
箱子钥匙。左:
箱子钥匙。右:
案例密钥。主页:
案例关键。结束:
违约:
return!DataGridViewWantInputKey;
}
}
//实现IDataGridViewEditingControl.PrepareEditingControlForEdit
//方法。
public void PrepareEditingControlForEdit(bool selectAll)
{
//不需要做任何准备。
}
//实现IDataGridViewEditing控件
//.重新定位EditingControlOnValueChange属性。
公共布尔重新定位编辑控制值更改
{
得到
{
返回false;
}
}
//实现IDataGridViewEditing控件
//.EditingControlDataGridView属性。
公共DataGridView编辑控制DataGridView
{
得到
{
返回dataGridView;
}
设置
{
dataGridView=值;
}
}
//实现IDataGridViewEditing控件
//.EditingControlValueChanged属性。
公共布尔编辑控制值已更改
{
得到
{
返回值已更改;
}
设置
{
valueChanged=值;
}
}
//实现IDataGridViewEditing控件
//.EditingPanelCursor属性。
公共游标编辑面板游标
{
得到
{
返回base.Cursor;
}
}
受保护的覆盖void OnTextChanged(事件参数e)
{
//通知DataGridView单元格的内容
//已经改变了。
valueChanged=true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnTextChanged(e);
}
}
公共分部类ucFolderBrowser:UserControl
{
公共ucFolderBrowser()
{
初始化组件();
}
公共重写字符串文本
{
得到
{
返回txtPath.Text;
}
设置
{
Text=值;
}
}
///
///设计器支持所需的方法-不修改
/