读书人

重写DataGridView控件,怎么实现自动空

发布时间: 2012-12-14 10:33:08 作者: rapoo

重写DataGridView控件,如何实现自动空数据集
由于自带的DataGridView控件功能太普通了,自己想重写这个控件,继承已经实现了一些功能,但现在希望这个控件能在最初实现空白行填充数据区域,并同时绑定一个空数据集.
现在空白行填充已经实现,但绑定空数据集却有问题,在重绘控件时,会自动增加对应的列,一直未解决,请大家帮我看一下,该如何实现?


public class MyDataGridView : DataGridView
{
public MyDataGridView(): base()
{
InitializeComponent();
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.Columns.Count > 0)
{
DataTable myTable = new DataTable();
if (this.DataSource != null)
{
myTable = (DataTable)this.DataSource;
}
else
{
//问题就出在这里,如果没有此循环,绑定的数据集为空,却没有列信息,不便于后期数据处理;如果加上此循环,在别的程序调用设计控件时,添加列会在*.Designer.cs文件中自动增加对应的列.
foreach (DataGridViewColumn myCol in this.Columns)
{
myTable.Columns.Add(myCol.Name, typeof(System.String));
}
}
//循环添加行
if (this.DisplayedRowCount(false) == this.Rows.Count)
{
while (this.DisplayedRowCount(false) == this.Rows.Count)
{
if (this.Rows.Count == 0)
{
myTable.Rows.Add(myTable.NewRow());
this.DataSource = myTable;
}
else


{
if (this.Rows[0].Height * (this.Rows.Count + 1) < this.Height - SystemInformation.HorizontalScrollBarHeight)
{
myTable.Rows.Add(myTable.NewRow());
this.DataSource = myTable;
}
else
{
break;
}
}
}
}
}

}


[最优解释]
建个空DataSet绑定
[其他解释]
在onpaint里做数据源...感觉太奇怪,换换思路,datasource update什么的
[其他解释]
我这是继承写的一个控件,使用控件前不能确定空数据集的列信息,所以想采用下面的方法绑定,结果在其他程序调用这个控件,设计新增列时会增加一倍的列出来.

DataTable myTable = new DataTable();
foreach (DataGridViewColumn myCol in this.Columns)
{
myTable.Columns.Add(myCol.Name, typeof(System.String));
}
this.DataSource = myTable;

[其他解释]
本来设计时添加2列:
this.Column1 = new DataGridViewTextBoxColumn();
this.Column2 = new DataGridViewTextBoxColumn();
结果系统又自动添加了下面两列.
this.dataGridViewTextBoxColumn1 = new DataGridViewTextBoxColumn();
this.dataGridViewTextBoxColumn2 = new DataGridViewTextBoxColumn();
为什么会增加这两列呢?一直百思不得其解.
------其他解决方案--------------------


我也觉得写在onpaint事件里不太对,那样如果运行时会反复调用,影响效率.
除此之外,不知道有没有什么事件在运行控件之前执行,构造函数里我试过的,由于还没有执行onpaint事件,列也就为空,也无法绑定空数据集.

读书人网 >C#

热点推荐