none
如何给自定义的DataGridViewTextBoxColumn类加属性。。。。。。。。。。。。。。。。。。。。。 RRS feed

  • 问题

  • 自己写了一个自定义的DataGridViewTextBoxColumn类,
    现在再gridview中点击列的编辑,选上自定义的列后,设置在自定义DataGridViewTextBoxColumn类中的属性
    可以设置,不过就是保存不上,在打开就不见了,发现在这里设置后designer文件中没有被设置上的,始终是[属性 = "";]
    就算我强行写入,下次打开列的编辑还是看不到设置的属性。。。

    听说要用Clone,不能直接写在DataGridViewTextBoxColumn类,不懂,请指教~~~~~

    2010年12月16日 8:28

答案

  • 知道原因了,cell的属性其实是由column clone过去的

    要在column中的clone中实现一下

     

        public partial class ComTextBoxColumn : DataGridViewTextBoxColumn
        {
           

            public ComTextBoxColumn()
            {
                InitializeComponent();

                //セルのテンプレートを最新に設置する
                this.CellTemplate = new ComTextBoxCell(typeFlg);

            }

            #region  コントロールのタイプ

            // コントロールのタイプ用
            private EnumDefine.textType typeFlg;

            // 必入力チェック用
            private bool required;

            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public EnumDefine.textType TypeFlg
            {
                get
                {
                    return this.typeFlg;
                }
                set
                {
                    this.typeFlg = value;
                }
            }

            /// <summary>
            /// 必入力チェック
            /// </summary>
            public bool Required
            {
                get
                {
                    return this.required;
                }
                set
                {
                    this.required = value;
                }
            }

            /// <summary>
            /// 複製された System.Windows.Forms.DataGridViewBand
            /// </summary>
            /// <returns></returns>
            public override object Clone()
            {
                ComTextBoxColumn col = (ComTextBoxColumn)base.Clone();

                ((ComTextBoxCell)col.CellTemplate).Required = required;
                ((ComTextBoxCell)col.CellTemplate).TypeFlg = typeFlg;
                col.Required = required;
                col.TypeFlg = typeFlg;
                return col;
            }

            #endregion
        }

     

     

     

        public partial class ComTextBoxCell : DataGridViewTextBoxCell
        {
            public ComTextBoxCell()
            {
                InitializeComponent();
            }

            public ComTextBoxCell(EnumDefine.textType type)
            {
                this.typeFlg = type;

                InitializeComponent();
            }

            #region 内部変数

            // コントロールのタイプ用
            private EnumDefine.textType typeFlg = EnumDefine.textType.Default;

            // 必入力チェック用
            private bool required;

            // エラーのフラグ
            private bool errorFlg;

            #endregion

            #region  コントロールのタイプ
            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public EnumDefine.textType TypeFlg
            {
                get
                {
                    return typeFlg;
                }
                set
                {
                    typeFlg = value;
                }
            }

            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public bool ErrorFlg
            {
                get
                {
                    return errorFlg;
                }
                set
                {
                    errorFlg = value;
                }
            }

            /// <summary>
            /// 必入力チェック
            /// </summary>
            public bool Required
            {
                get
                {
                    return required;
                }
                set
                {
                    required = value;
                }
            }

            /// <summary>
            /// 対象のセルの同一コピーを作成します。
            /// </summary>
            /// <returns></returns>
            public override object Clone()
            {
                ComTextBoxCell col = (ComTextBoxCell)base.Clone();
                col.Required = required;
                col.TypeFlg = typeFlg;
                col.ErrorFlg = errorFlg;
                return col;
            }


            public override object ParseFormattedValue(object formattedValue, DataGridViewCellStyle cellStyle, TypeConverter formattedValueTypeConverter, TypeConverter valueTypeConverter)
            {
                try
                {
                    switch (typeFlg)
                    {
                        // 時間の場合
                        case EnumDefine.textType.Date:
                            return ClsFormat.formatDateYYYYMMDD(ClsFormat.unformatDate(formattedValue.ToString()));
                        // 数字の場合
                        case EnumDefine.textType.Number:
                            return ClsFormat.formatViewNumber(formattedValue.ToString(), cellStyle.Format);
                        //年月yyyy/MM
                        case EnumDefine.textType.YM:
                            return ClsFormat.formatDateYYYYMM(formattedValue.ToString());
                        //年yyyy
                        case EnumDefine.textType.YYYY:
                            break;
                        //時間HH:mm:ssの場合
                        case EnumDefine.textType.HHMMSS:
                            break;

                        //時分HH:mmの場合
                        case EnumDefine.textType.HHMM:

                            break;
                        default:
                            break;
                    }

                    return formattedValue;
                }
                catch
                {
                    //何もしなくてもいい。
                }
                return base.ParseFormattedValue(formattedValue, cellStyle, formattedValueTypeConverter, valueTypeConverter);

            }

            #endregion
        }

    2010年12月17日 2:16

全部回复

  • dear
    你有设定[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]吗?

    [User Control] 自訂控制項的集合屬性 /User Control of Collection Properties
    http://www.dotblogs.com.tw/yc421206/archive/2010/06/30/16284.aspx

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年12月16日 10:06
  • dear
    你有设定[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]吗?

    [User Control] 自訂控制項的集合屬性 /User Control of Collection Properties
    http://www.dotblogs.com.tw/yc421206/archive/2010/06/30/16284.aspx

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    我在设计时,可以看到,就是设置无果
    2010年12月17日 0:08
  • dear
    那你设计阶段所改的设定,VS有帮你加上程式码吗,如同我给你的网页连结上的说明?

     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年12月17日 1:46
  • 知道原因了,cell的属性其实是由column clone过去的

    要在column中的clone中实现一下

     

        public partial class ComTextBoxColumn : DataGridViewTextBoxColumn
        {
           

            public ComTextBoxColumn()
            {
                InitializeComponent();

                //セルのテンプレートを最新に設置する
                this.CellTemplate = new ComTextBoxCell(typeFlg);

            }

            #region  コントロールのタイプ

            // コントロールのタイプ用
            private EnumDefine.textType typeFlg;

            // 必入力チェック用
            private bool required;

            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public EnumDefine.textType TypeFlg
            {
                get
                {
                    return this.typeFlg;
                }
                set
                {
                    this.typeFlg = value;
                }
            }

            /// <summary>
            /// 必入力チェック
            /// </summary>
            public bool Required
            {
                get
                {
                    return this.required;
                }
                set
                {
                    this.required = value;
                }
            }

            /// <summary>
            /// 複製された System.Windows.Forms.DataGridViewBand
            /// </summary>
            /// <returns></returns>
            public override object Clone()
            {
                ComTextBoxColumn col = (ComTextBoxColumn)base.Clone();

                ((ComTextBoxCell)col.CellTemplate).Required = required;
                ((ComTextBoxCell)col.CellTemplate).TypeFlg = typeFlg;
                col.Required = required;
                col.TypeFlg = typeFlg;
                return col;
            }

            #endregion
        }

     

     

     

        public partial class ComTextBoxCell : DataGridViewTextBoxCell
        {
            public ComTextBoxCell()
            {
                InitializeComponent();
            }

            public ComTextBoxCell(EnumDefine.textType type)
            {
                this.typeFlg = type;

                InitializeComponent();
            }

            #region 内部変数

            // コントロールのタイプ用
            private EnumDefine.textType typeFlg = EnumDefine.textType.Default;

            // 必入力チェック用
            private bool required;

            // エラーのフラグ
            private bool errorFlg;

            #endregion

            #region  コントロールのタイプ
            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public EnumDefine.textType TypeFlg
            {
                get
                {
                    return typeFlg;
                }
                set
                {
                    typeFlg = value;
                }
            }

            /// <summary>
            /// コントロールのタイプ
            /// </summary>
            public bool ErrorFlg
            {
                get
                {
                    return errorFlg;
                }
                set
                {
                    errorFlg = value;
                }
            }

            /// <summary>
            /// 必入力チェック
            /// </summary>
            public bool Required
            {
                get
                {
                    return required;
                }
                set
                {
                    required = value;
                }
            }

            /// <summary>
            /// 対象のセルの同一コピーを作成します。
            /// </summary>
            /// <returns></returns>
            public override object Clone()
            {
                ComTextBoxCell col = (ComTextBoxCell)base.Clone();
                col.Required = required;
                col.TypeFlg = typeFlg;
                col.ErrorFlg = errorFlg;
                return col;
            }


            public override object ParseFormattedValue(object formattedValue, DataGridViewCellStyle cellStyle, TypeConverter formattedValueTypeConverter, TypeConverter valueTypeConverter)
            {
                try
                {
                    switch (typeFlg)
                    {
                        // 時間の場合
                        case EnumDefine.textType.Date:
                            return ClsFormat.formatDateYYYYMMDD(ClsFormat.unformatDate(formattedValue.ToString()));
                        // 数字の場合
                        case EnumDefine.textType.Number:
                            return ClsFormat.formatViewNumber(formattedValue.ToString(), cellStyle.Format);
                        //年月yyyy/MM
                        case EnumDefine.textType.YM:
                            return ClsFormat.formatDateYYYYMM(formattedValue.ToString());
                        //年yyyy
                        case EnumDefine.textType.YYYY:
                            break;
                        //時間HH:mm:ssの場合
                        case EnumDefine.textType.HHMMSS:
                            break;

                        //時分HH:mmの場合
                        case EnumDefine.textType.HHMM:

                            break;
                        default:
                            break;
                    }

                    return formattedValue;
                }
                catch
                {
                    //何もしなくてもいい。
                }
                return base.ParseFormattedValue(formattedValue, cellStyle, formattedValueTypeConverter, valueTypeConverter);

            }

            #endregion
        }

    2010年12月17日 2:16