none
一个问题,关于DataGridViewCell,更改ReadOnly属性的通知的 RRS feed

  • 问题

  • 我需要在更改列ReadOnly的时候,重绘其内容

    我有没有办法得到其更改的通知事件呢?

    我视图重载ReadOnly属性,但是其父对象(如行)ReadOnly更改不会影响其属性

     


    QQ:249590012 mail:yyz985@yahoo.com.cn
    2010年5月6日 6:06

全部回复

  • 你好!

            你可以重写Paint方法来实现重绘,具体可以参考:

    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcell.paint%28VS.80%29.aspx

            希望对你有帮助!


    周雪峰
    2010年5月6日 8:34
    版主
  • 谢谢你

    不过我现在就是重绘Paint方法的,但是我需要收到ReadOnly消息来进行即时重绘,而不需要最小化再最大化窗体来刷新状态

     


    QQ:249590012 mail:yyz985@yahoo.com.cn
    2010年5月6日 8:47
  • 你好!

         ReadOnly属性改变并没有触发什么事件!

         你可以重写这个属性,触发自己的事件,记得调用父类的属性!


    周雪峰
    2010年5月6日 14:17
    版主
  • 谢谢你的回复,我现在就是重写ReadOnly属性,但是行、列(所有单元格的父对象的ReadOnly更改)的ReadOnly属性更改的时候我无法获知,列ReadOnly我也重写了,行ReadOnly不好重写,因为新行是自动生成的。

     


    QQ:249590012 mail:yyz985@yahoo.com.cn
    2010年5月8日 13:38
  • 你重写的时候返回父类的这个属性了吗?

    base.ReadOnly=value;


    周雪峰
    2010年5月10日 1:53
    版主
  • 我是这样写的:

    class MyDataGridViewCheckBoxCell
    {
    public override bool ReadOnly
    {
    	get
    	{
    		if (this.OwningColumn.ReadOnly) return true;
    		return base.ReadOnly;
    	}
    	set
    	{
    		bool columnReadOnly = this.DataGridView.Columns[this.ColumnIndex].ReadOnly;
    		base.ReadOnly = value;
    		this.DataGridView.InvalidateCell(this);
    		if (columnReadOnly == true && value == false)
    			this.DataGridView.InvalidateCell(this.DataGridView.Columns[this.ColumnIndex].HeaderCell);
    	}
    }
    
    
    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
    	if (this.ReadOnly == false) {
    		base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
    	} else {
    		base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts & ~DataGridViewPaintParts.ContentForeground);
    		//Size s = CheckBoxRenderer.GetGlyphSize(graphics, CheckBoxState.CheckedDisabled);
    		//CheckBoxRenderer.DrawCheckBox(graphics, new Point((cellBounds.Width - s.Width) / 2 + cellBounds.X - 1, cellBounds.Y + (cellBounds.Height - s.Height) / 2 - 1)
    		//  , (true.Equals(formattedValue) ? CheckBoxState.CheckedDisabled : CheckBoxState.UncheckedDisabled));
    		if (this.RowIndex >= 0 && true.Equals(this.Value)) graphics.DrawString("√", SystemFonts.DefaultFont, SystemBrushes.WindowText, cellBounds, StringFormatCenter);
    	}
    }
    }

    QQ:249590012 mail:yyz985@yahoo.com.cn
    2010年5月10日 6:23