如何阻止Designer生成DataGridViewColumn

时间:2017-01-19 10:07:44

标签: c# winforms visual-studio-2012

我正在使用固定的列和行开发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());
            }
        }
    }
}

2 个答案:

答案 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());
            }
        }
    }

}