C# 处理自定义DataGridView列的调整大小事件

C# 处理自定义DataGridView列的调整大小事件,c#,.net,datagridview,resize,C#,.net,Datagridview,Resize,我已尝试实现自己的自定义DataGridView列。我使用以下代码完成了这项工作。从此MSDN页面借用和修改: 我遇到的难题是如何通知usercontrol ucFolderBrowser gridviewcolumn的大小已调整,需要相应地进行调整 class FolderGridViewColumn : DataGridViewColumn { public FolderGridViewColumn() : base(new FolderCell()) { }

我已尝试实现自己的自定义DataGridView列。我使用以下代码完成了这项工作。从此MSDN页面借用和修改:

我遇到的难题是如何通知usercontrol ucFolderBrowser gridviewcolumn的大小已调整,需要相应地进行调整

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=值;
}
}
///  
///设计器支持所需的方法-不修改
/