代码之家  ›  专栏  ›  技术社区  ›  nightcoder

DataGridView AutoGenerateColumns以某种方式设置为true

  •  1
  • nightcoder  · 技术社区  · 15 年前

    我从DataGridView派生DataGridViewEx类,如下所示:

    public class DataGridViewEx : DataGridView
    {
        // ... 
    
        [DefaultValue(false)]
        [Browsable(true)]
        public new bool AutoGenerateColumns
        {
            get { return base.AutoGenerateColumns; }
            set { base.AutoGenerateColumns = value; }
        }
    
        public DataGridViewEx()
        {
            AutoGenerateColumns = false;
        }
    
        // ...
    }
    

    有什么想法吗?

    4 回复  |  直到 8 年前
        1
  •  4
  •   nightcoder    15 年前

    我下载了.NET源代码,以便能够调试.NET framework,如下所述:
    http://referencesource.microsoft.com/serversetup.aspx


    我在reflector中打开此方法并看到以下内容:

    public override void Initialize(IComponent component)  
    {
      ...
      view.AutoGenerateColumns = view.DataSource == null;
      ...
    }
    

    因此,由于DataSource为null,Initialize()方法将AutoGeneratedColumns设置为true:(

    我想从DataGridViewDesigner类派生我自己的设计器来重写此行为,但DataGridViewDesigner是内部的,所以我不能。

    因此,似乎没有办法妥善解决这个问题:(

        2
  •  2
  •   Adam Robinson    15 年前

    AutogenerateColumns new 自动生成列 true 限制您的调试能力,因为您无法执行 Console.WriteLine(Environment.StackTrace) 或者类似的东西在你的塞特。

    您可能需要使用诸如Reflector之类的工具来尝试找到将其设置为true的位置,但这对于除最简单的场景外的所有场景都是有问题的(例如,如果父级直接设置backing变量)。您确实需要进行一些尝试和错误操作,以找到设置值的位置, 然后 打电话给你的 AutoGeneratedColumns = false; 密码我会超越 OnCreateControl 并检查其中的值作为开始。

        3
  •  2
  •   C-Pound Guru    15 年前

        4
  •  2
  •   Basuro    11 年前

    我的解决方案很简单:观察环境的变化 AutoGenerateColumns 凌驾 OnAutoGenerateColumnsChanged 如果不需要更改,请将其还原:

    public class MyDataGridView : DataGridView
    {
        private bool mbAutoGenerateColumns = false;
    
        [Browsable(true)]
        [Category("Behavior")]
        [DefaultValue(false)]
        new public bool AutoGenerateColumns
        {
            get { return base.AutoGenerateColumns; }
            set { base.AutoGenerateColumns = mbAutoGenerateColumns = value; }
        }
    
        public MyDataGridView()
        {
            // Set AGC to false right on the start
            AutoGenerateColumns = false;
        }
    
        protected override void OnAutoGenerateColumnsChanged(EventArgs e)
        {
            base.OnAutoGenerateColumnsChanged(e);
    
            // When AGC gets changed, check if the change happened
            //  internally or through the new property.
            // If internally, revert!
            // Since DGV has a tendency to enable AGC, only the setting
            //  to false is explicitly needed, the rest happens automatically
            if(!mbAutoGenerateColumns && base.AutoGenerateColumns)
                base.AutoGenerateColumns = false;
        }
    }
    

    我知道这是一个相当的黑客,但它的工作,因为控制设计师-如前所述-是不可推导的,这是我能找到的最好的。