继承dataGridView(随便继承什么都可以)我加了一个string[]属性  [ToolboxBitmap(typeof(System.Windows.Forms.DataGridView))]
    public partial class sanDataGrid : DataGridView
    {
        public sanDataGrid()
        {
            InitializeComponent();
        }
        private string[] insertValue;
        /// <summary>
        /// NCity开发
         /// 插入内容
        /// </summary>
        [Category("先行科技"), Description("插入列数据")]
        public string[] InsertValue
        {
            get
            {
                
                return this.insertValue;
            }
            set 
            { 
                this.insertValue = value; 
            }
        }
}
新建一个WindowsForm项目,把sanDataGrid控件拉到Form1中,找到InsertValue这个属性,点击可弹出一个对话框,请问有没有办法获取该对话框确定按钮的事件来进行相应操作?
比如:在datagridview控件中,点击编辑列的时候,弹出一个对话框,然后在哪个对话框点击确认的时候,datagridview控件就会加几个列,请问这个确认按钮应该怎么才能获得它的事件?

解决方案 »

  1.   

    你要求的功能和你的string[]属性有什么关系?
      

  2.   

    这个对话框是在开发的时候用的,和事件有什么关系?倒是应该可以在sanDataGrid里添加一个ValueInserted事件,在InsertValue的set方法内构造参数触发这个事件。不知道这是不是楼主想要的?
      

  3.   

    你给属性付值,当然是在 set 里面做处理啊。[Category("先行科技"), Description("插入列数据")]
    public string[] InsertValue
    {
        get
        {    
            return this.insertValue;
        }
        set 
        { 
            this.insertValue = value; 
            // add cols
        }
    }
      

  4.   

    你要继承Grid控件然后自己写定制属性。属于IDE编程的范围。
      

  5.   

    我要的功能是在程序员编辑控件的时候,当string[]这个属性更改时控件重绘。我应该怎么获得这个string[]属性更改过了
      

  6.   

    你这样在运行的时候才会触发事件,我在要编辑控件的时候触发,即还在VS里面使用控件的时候触发事件
    比如:你在datagridivew添加列的时候的类似功能
      

  7.   


    如果是这样子的话,和那个可视化编辑界面就没有关系了。你自己定义一个事件比如叫InsertValueChanging,在string[]被编辑时触发并调用OnPaint
      

  8.   

    找到InsertValue这个属性,点击可弹出一个对话框,请问有没有办法获取该对话框确定按钮的事件来进行相应操作? 
    ------------------------设计时,不能获得IDE的事件吧,不太明白
      

  9.   

    在string[]被编辑时触发
    请问这个被编辑时应该怎么去弄?3Q,我怎么把这个事件写到这个时候触发?
      

  10.   

    精确确定你需求的事件触发时机很重要。
    又想了一下,就你string[]这个属性的定义来看,感觉你是想在插入列或者删除列之后,为控件的外观做一些即时修改。
    如果是这样子的话,其实你只要在原DataGridView的OnPaint上挂接一个事件,或者重写OnPaint事件即可。因为列的增加自会引发控件重绘。下面是一个挂接事件的小Demo,你可以运行一下看看。不过我感觉你想要可能并不是这个时机。关于时机的确定,需要你把需求描述的非常清楚才行。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;namespace TestWinFormControl
    {
        [ToolboxBitmap(typeof(System.Windows.Forms.DataGridView))]
        public partial class sanDataGrid : DataGridView
        {
            public sanDataGrid()
                : base()
            {
                InitializeComponent();            base.ColumnAdded +=new DataGridViewColumnEventHandler(sanDataGrid_ColumnAdded);
            }        public void  sanDataGrid_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
            {
              MessageBox.Show("New Column!");
            }
            private string[] insertColumnsValue;
            /// <summary>
            /// NCity开发
            /// 插入内容
            /// </summary>
            [Category("先行科技"), Description("插入列数据")]
            public string[] InsertColumnsValue
            {
                get
                {
                    return this.insertColumnsValue;
                }
                set
                {
                    this.insertColumnsValue = value;
                }        }    }
    }
      

  11.   


    这样的方法都是运行时才有效。。楼主的要求可能只有对IDE进行一些定制了。。
      

  12.   


    在set里调用其它方法,没理解怎么搞得那么复杂!
      

  13.   

    在自定义控件中为自定义属性的更改添加事件,与IDE定制一点关系都没有。建个类库项目,把那段代码直接贴进去编译。
    在工具箱中添加这个自定义控件,再拉到你的WinForm项目的Form可视化设计界面上,可视化添加一个列,马上就看到效果。
      

  14.   

    同意上面的说服。关键字:componentDesigner
      

  15.   


    namespace WindowsFormsControlLibrary1
    {
        public partial class UserControl1 : UserControl
        {
            public UserControl1()
            {
                InitializeComponent();
            }        protected override void OnPaint(PaintEventArgs e)
            {
                if (insertValue != null)
                {
                    foreach (string s in insertValue)
                        this.textBox1.Text += s + "&";
                }
                base.OnPaint(e);
            }        private string[] insertValue;
            /// <summary>
            /// NCity开发
            /// 插入内容
            /// </summary>
            [Category("先行科技"), Description("插入列数据")]
            public string[] InsertValue
            {
                get
                {                return this.insertValue;
                }
                set
                {
                    this.insertValue = value;
                }
            }    }
    }自定义控件,放个textbox ,没用什么事件
    不过代码可能不好,给个思路而已
      

  16.   

    一整天没来坛子里回帖,看样子这次冲周排名的希望破灭了。。哎,晚上加班ING!!
      

  17.   

    我现在也准备学习c#了,以前做VB的,以后还请多帮忙呀.
    接分___
      

  18.   

     public partial class sanDataGrid : DataGridView
        {
            public sanDataGrid()
            {
                //InitializeComponent();
            }
            private string[] insertValue;
            /// <summary>
            /// NCity开发
            /// 插入内容
            /// </summary>
            public string[] InsertValue
            {
                get
                {                return this.insertValue;
                }
                set
                {
                   
                    this.insertValue = value;
                    if (this.insertValue.Length > 0)
                    {
                        for (int i = 0; i < this.insertValue.Length; i++)
                        {
                            DataGridViewTextBoxColumn textBox = new DataGridViewTextBoxColumn();
                            textBox.HeaderText = this.insertValue[i].ToString();
                            this.Columns.Add(textBox);
                        }
                    }
                }
            }
    不知道楼主是不是要这样的效果
      

  19.   


      public partial class sanDataGrid : DataGridView
        {
            public sanDataGrid()
            {
                
            }
            private string[] insertValue;
            /// <summary>
            /// NCity开发
            /// 插入内容
            /// </summary>
            [Category("先行科技"), Description("插入列数据")]
            public string[] InsertValue
            {
                get
                {                return this.insertValue;
                }
                set
                {
                    this.insertValue = value;
                    if (this.insertValue.Length > 0)
                    {
                        this.Columns.Clear();
                        for (int i = 0; i < this.insertValue.Length; i++)
                        {
                            DataGridViewTextBoxColumn textBox = new DataGridViewTextBoxColumn();
                            textBox.HeaderText = this.insertValue[i].ToString();
                            this.Columns.Add(textBox);
                        }
                    }                
                }
            }
        }是不是这样
      

  20.   

    不是在运行的时候看到效果,是在你设置属性InsertValue后就可以看到效果的
      

  21.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;namespace Tigers_WindowsControlLibrary.Windows
    {
        public partial class TextBox_Validate : Tigers_WindowsControlLibrary.Windows.TextBox
        {
            public TextBox_Validate()
            {
                InitializeComponent();
                this.TextChanged += new EventHandler(TextBox_Validate_TextChanged);
                this.Leave += new EventHandler(TextBox_Validate_Leave);
            }        //焦点移动开时错误数据必须修改
            void TextBox_Validate_Leave(object sender, EventArgs e)
            {
                if (!this._checked)
                {
                    this.Focus();
                }
                //throw new Exception("The method or operation is not implemented.");
            }        //验证用户的输入
            void TextBox_Validate_TextChanged(object sender, EventArgs e)
            {
                //当用户没有数据数据,并且数据允许为空时
                if (this.Text.Equals(string.Empty) && this._dataIsNull == true)
                {
                    this._checked = true;
                }
                else
                {
                    this._checked = Tigers_WindowsControlLibrary.DataValidate.RegularValidate.FitString(this._validateString, this.Text);
                }
                //throw new Exception("The method or operation is not implemented.");
            }
            private bool _dataIsNull = true;        [
            Category("数据验证"),
            Description("数据是否允许为空"),
            DefaultValue(true)
            ]
            public bool DataIsNull
            {
                get { return _dataIsNull; }
                set { _dataIsNull = value; }
            }
            //数据是否通过验证
            private bool _checked = false;        [
            Category("数据验证"),
            Description("数据验证是否成功"),
            DefaultValue(false)
            ]
            public bool Checked
            {
                get
                {
                    if (this.Text.Equals(string.Empty) && this._dataIsNull == true)
                    {
                        return true;
                    }
                    else
                    {
                        return _checked;
                    }
                }
               // set { _checked = value; }
            }        //验证数据的方式
            private string _validateString = string.Empty;
            [
            Editor(typeof(TextBox_Validate_ListBox_DropDownEdit), typeof(System.Drawing.Design.UITypeEditor)),
            Category("数据验证"),
            Description("对数据验证的正则表达式"),
            DefaultValue("")
            ]
            public string ValidateString
            {
                get { return _validateString; }
                set { _validateString = value; }
            }
        }
    }
      

  22.   

    我不知理解的对不对,楼主的意思是捕获
    public partial class sanDataGrid : DataGridView
        {
            public sanDataGrid()
            {
                
            }
            private string[] insertValue;
            public delegate void BtnClick(object sender,EventArgs e);  //自义一个委托
            public event BtnClick Btn_Click;           //声明一个事件
            /// <summary>
            /// NCity开发
            /// 插入内容
            /// </summary>
            [Category("先行科技"), Description("插入列数据")]
            public string[] InsertValue
            {
                get
                {                return this.insertValue;
                }
                set
                {
                    this.insertValue = value;
                    if (this.insertValue.Length > 0)
                    {
                          Btn_Click(this, EventArgs e) //当给属性赋值时,触发事件。
                    }                
                }
            }
        }
    然后,在外部写Btn_Click事件处理程序就可以了,我觉得外部事件处理方法,楼主参照79楼的就可以了,不知我的意思是不是你想要的,