我正在使用固定的列和行开发MyDataGridView控件。
public partial class MyDataGridView
{
public MyDataGridView()
{
CreateColumns();
CreateRows();
}
}
当我在设计时将MyDataGridView添加到Form上时,设计器会自动生成更多列 - 与上面构造函数中使用CreateColumns()创建的列完全相同。我可以阻止设计师这样做吗?
private void CreateColumns(); // Creates columns of MyDataGridView.
请将此代码添加到WindowsFormsApplication项目,从Form1上的ToolBox编译并拖动MyDataGridView控件,然后运行该应用程序。了解Designer的行为和生成代码(Form1.Designer.cs)。
namespace WindowsFormsApplication1
{
public class MyDataGridView : System.Windows.Forms.DataGridView
{
public MyDataGridView()
{
CreateColumns();
CreateRows();
}
private void CreateColumns()
{
for (int day = 0; day < 7; day++)
{
this.Columns.Add(new DataGridViewTextBoxColumn());
}
}
private void CreateRows()
{
for (int n = 0; n < 6; n++)
{
this.Rows.Add(new DataGridViewRow());
}
}
}
}
答案 0 :(得分:1)
尝试这种方法: -
首先设置AutoGenerateColumns="False"
和
如果列的ColumnName等于您可以排除的值,则取消列的生成,例如
private void MyDataGrid_AutoGenerateColumn(
object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if ((string)e.Column.Header == "fieldname")
{
e.Cancel = true;
}
}
谢谢, Abhilash.J.A
答案 1 :(得分:0)
我必须使用上面代码中给出的固定列和行创建DataGridView。但是这项任务在设计时会产生一些副作用,因为它会导致设计人员自动生成列。
最终我发现有几种方法可以防止设计师不受欢迎的行为。
1。 一种方法是通过创建新的DataGridView来覆盖DataGridView的设计者。
// For the following class to be correctly compiled
// System.Design.dll assembly must be included in the project
class MyDataGridViewDesigner : System.Windows.Forms.Design.ControlDesigner
{
}
[Designer(typeof(MyDataGridViewDesigner))]
public class MyDataGridView : System.Windows.Forms.DataGridView
{
}
2.我还发现,通过设置“DataGridView”类的“Columns”属性的序列化可见性,可以阻止设计人员自动生成列。
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public class MyDataGridView : System.Windows.Forms.DataGridView
{
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new DataGridViewColumnCollection Columns
{
get
{
return base.Columns;
}
}
}
}
3.第三种方式需要覆盖像这样的“Columns”和“Rows”集合。这种方法使DataGridView“真正”修复。
using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public class MyDataGridView : System.Windows.Forms.DataGridView
{
public MyDataGridView()
{
CreateColumns();
CreateRows();
}
class MyDataGridViewColumnCollection : DataGridViewColumnCollection
{
internal MyDataGridViewColumnCollection(MyDataGridView dgv)
: base(dgv)
{
}
internal void AddInternal(DataGridViewTextBoxColumn column)
{
base.Add(column);
}
public override int Add(DataGridViewColumn dataGridViewColumn)
{
return -1;
}
public override int Add(string columnName, string headerText)
{
return -1;
}
public override void AddRange(params DataGridViewColumn[] dataGridViewColumns)
{
}
public override void Remove(DataGridViewColumn dataGridViewColumn)
{
}
public override void Remove(string columnName)
{
}
public override void RemoveAt(int index)
{
}
public override void Insert(int columnIndex, DataGridViewColumn dataGridViewColumn)
{
}
public override void Clear()
{
}
}
new MyDataGridViewColumnCollection Columns
{
get
{
return base.Columns as MyDataGridViewColumnCollection;
}
}
protected override DataGridViewColumnCollection CreateColumnsInstance()
{
return new MyDataGridViewColumnCollection(this);
}
class MyDataGridViewRowCollection : DataGridViewRowCollection
{
internal MyDataGridViewRowCollection(MyDataGridView dgv)
: base(dgv)
{
}
internal void AddInternal(DataGridViewRow dataGridViewRow)
{
base.Add(dataGridViewRow);
}
public override int Add()
{
return -1;
}
public override int Add(DataGridViewRow dataGridViewRow)
{
return -1;
}
public override int Add(int count)
{
return -1;
}
public override int Add(params object[] values)
{
return -1;
}
public override int AddCopies(int indexSource, int count)
{
return -1;
}
public override int AddCopy(int indexSource)
{
return -1;
}
public override void AddRange(params DataGridViewRow[] dataGridViewRows)
{
}
public override void Remove(DataGridViewRow dataGridViewRow)
{
}
public override void RemoveAt(int index)
{
}
public override void Insert(int rowIndex, DataGridViewRow dataGridViewRow)
{
}
public override void Insert(int rowIndex, int count)
{
}
public override void Insert(int rowIndex, params object[] values)
{
}
public override void InsertCopies(int indexSource, int indexDestination, int count)
{
}
public override void InsertCopy(int indexSource, int indexDestination)
{
}
public override void InsertRange(int rowIndex, params DataGridViewRow[] dataGridViewRows)
{
}
public override void Clear()
{
}
}
new MyDataGridViewRowCollection Rows
{
get
{
return base.Rows as MyDataGridViewRowCollection;
}
}
protected override DataGridViewRowCollection CreateRowsInstance()
{
return new MyDataGridViewRowCollection(this);
}
private void CreateColumns()
{
for (int day = 0; day < 7; day++)
{
this.Columns.AddInternal(new DataGridViewTextBoxColumn());
}
}
private void CreateRows()
{
for (int n = 0; n < 6; n++)
{
this.Rows.AddInternal(new DataGridViewRow());
}
}
}
}