继承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控件就会加几个列,请问这个确认按钮应该怎么才能获得它的事件?
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控件就会加几个列,请问这个确认按钮应该怎么才能获得它的事件?
public string[] InsertValue
{
get
{
return this.insertValue;
}
set
{
this.insertValue = value;
// add cols
}
}
比如:你在datagridivew添加列的时候的类似功能
如果是这样子的话,和那个可视化编辑界面就没有关系了。你自己定义一个事件比如叫InsertValueChanging,在string[]被编辑时触发并调用OnPaint
------------------------设计时,不能获得IDE的事件吧,不太明白
请问这个被编辑时应该怎么去弄?3Q,我怎么把这个事件写到这个时候触发?
又想了一下,就你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;
} } }
}
这样的方法都是运行时才有效。。楼主的要求可能只有对IDE进行一些定制了。。
在set里调用其它方法,没理解怎么搞得那么复杂!
在工具箱中添加这个自定义控件,再拉到你的WinForm项目的Form可视化设计界面上,可视化添加一个列,马上就看到效果。
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 ,没用什么事件
不过代码可能不好,给个思路而已
接分___
{
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);
}
}
}
}
不知道楼主是不是要这样的效果
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);
}
}
}
}
}是不是这样
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; }
}
}
}
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楼的就可以了,不知我的意思是不是你想要的,