【问题标题】:Custom DataGridView duplicated columns自定义 DataGridView 重复列
【发布时间】:2014-09-07 18:43:04
【问题描述】:

我通过从 DataGridView 继承创建了一个自定义 Winforms 控件。

自定义数据网格视图定义了它自己的列和映射。

但是,每当我将它从工具箱拖到表单的设计图面上时,表单都会为自定义控件中的每一列重新创建一个列控件 (DataGridViewTextBoxColumn),这样我最终得到的列数是我应该的两倍有。

整个想法是控件已经“自我意识”,所以我不需要表单来做任何事情。很明显,我忽略了一些简单的事情,但我比 Windows 更喜欢 Web,没有什么能立即成为造成这种情况的原因。

自定义数据网格:

 partial class StrategyGrid
{
        private System.ComponentModel.IContainer components = null;


        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle13 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle14 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle15 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle16 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle17 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle18 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle19 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle20 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle21 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle22 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle23 = new System.Windows.Forms.DataGridViewCellStyle();
            System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle24 = new System.Windows.Forms.DataGridViewCellStyle();
            this.zquantityDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.zbuyPricePerShareDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xbuyParcelTotalDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xtargetPricePerShareDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xtargetParcelTotalDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xTargetNetProfitAmt = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xTargetNetProfitPct = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xMarketPriceNetProfitAmt = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xMarketPriceNetProfitPct = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.xColumn2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
            this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
            this.SuspendLayout();
            // 
            // zquantityDataGridViewTextBoxColumn
            // 
            this.zquantityDataGridViewTextBoxColumn.DataPropertyName = "Quantity";
            dataGridViewCellStyle13.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            this.zquantityDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle13;
            this.zquantityDataGridViewTextBoxColumn.HeaderText = "Qty";
            this.zquantityDataGridViewTextBoxColumn.MinimumWidth = 85;
            this.zquantityDataGridViewTextBoxColumn.Name = "zquantityDataGridViewTextBoxColumn";
            this.zquantityDataGridViewTextBoxColumn.Width = 85;
            // 
            // zbuyPricePerShareDataGridViewTextBoxColumn
            // 
            this.zbuyPricePerShareDataGridViewTextBoxColumn.DataPropertyName = "BuyPricePerShare";
            dataGridViewCellStyle14.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle14.Format = "N2";
            dataGridViewCellStyle14.NullValue = null;
            this.zbuyPricePerShareDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle14;
            this.zbuyPricePerShareDataGridViewTextBoxColumn.HeaderText = "Buy Price";
            this.zbuyPricePerShareDataGridViewTextBoxColumn.MinimumWidth = 85;
            this.zbuyPricePerShareDataGridViewTextBoxColumn.Name = "zbuyPricePerShareDataGridViewTextBoxColumn";
            this.zbuyPricePerShareDataGridViewTextBoxColumn.ToolTipText = "Buy price per share";
            this.zbuyPricePerShareDataGridViewTextBoxColumn.Width = 85;
            // 
            // zbuyParcelSubtotalDataGridViewTextBoxColumn
            // 
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.DataPropertyName = "BuyParcelSubtotal";
            dataGridViewCellStyle15.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle15.Format = "C2";
            dataGridViewCellStyle15.NullValue = null;
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle15;
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.HeaderText = "Buy Sub";
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.MinimumWidth = 85;
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.Name = "zbuyParcelSubtotalDataGridViewTextBoxColumn";
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.Visible = false;
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn.Width = 85;
            // 
            // zbuyBrokerageFeeAmountDataGridViewTextBoxColumn
            // 
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.DataPropertyName = "BuyBrokerageFeeAmount";
            dataGridViewCellStyle16.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle16.Format = "C0";
            dataGridViewCellStyle16.NullValue = null;
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle16;
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.HeaderText = "Rates";
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.MinimumWidth = 75;
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.Name = "zbuyBrokerageFeeAmountDataGridViewTextBoxColumn";
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.ToolTipText = "Buy Brokerage Rates";
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.Visible = false;
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn.Width = 75;
            // 
            // xbuyParcelTotalDataGridViewTextBoxColumn
            // 
            this.xbuyParcelTotalDataGridViewTextBoxColumn.DataPropertyName = "BuyParcelTotal";
            dataGridViewCellStyle17.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle17.Format = "N0";
            dataGridViewCellStyle17.NullValue = null;
            this.xbuyParcelTotalDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle17;
            this.xbuyParcelTotalDataGridViewTextBoxColumn.HeaderText = "Buy Price Total";
            this.xbuyParcelTotalDataGridViewTextBoxColumn.MinimumWidth = 85;
            this.xbuyParcelTotalDataGridViewTextBoxColumn.Name = "xbuyParcelTotalDataGridViewTextBoxColumn";
            this.xbuyParcelTotalDataGridViewTextBoxColumn.ToolTipText = "Buy Total Parcel Cost";
            this.xbuyParcelTotalDataGridViewTextBoxColumn.Width = 85;
            // 
            // xbreakevenPricePerShareDataGridViewTextBoxColumn
            // 
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.DataPropertyName = "BreakevenPricePerShare";
            dataGridViewCellStyle18.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle18.Format = "N2";
            dataGridViewCellStyle18.NullValue = null;
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle18;
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.HeaderText = "B/E Price";
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.MinimumWidth = 100;
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.Name = "xbreakevenPricePerShareDataGridViewTextBoxColumn";
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn.ToolTipText = "Breakeven price per share";
            // 
            // xtargetPricePerShareDataGridViewTextBoxColumn
            // 
            this.xtargetPricePerShareDataGridViewTextBoxColumn.DataPropertyName = "TargetPricePerShare";
            dataGridViewCellStyle19.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle19.Format = "N2";
            dataGridViewCellStyle19.NullValue = null;
            this.xtargetPricePerShareDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle19;
            this.xtargetPricePerShareDataGridViewTextBoxColumn.HeaderText = "Target Price";
            this.xtargetPricePerShareDataGridViewTextBoxColumn.MinimumWidth = 100;
            this.xtargetPricePerShareDataGridViewTextBoxColumn.Name = "xtargetPricePerShareDataGridViewTextBoxColumn";
            this.xtargetPricePerShareDataGridViewTextBoxColumn.ToolTipText = "Target price per share";
            // 
            // xtargetParcelTotalDataGridViewTextBoxColumn
            // 
            this.xtargetParcelTotalDataGridViewTextBoxColumn.DataPropertyName = "TargetParcelTotal";
            dataGridViewCellStyle20.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle20.Format = "N0";
            dataGridViewCellStyle20.NullValue = null;
            this.xtargetParcelTotalDataGridViewTextBoxColumn.DefaultCellStyle = dataGridViewCellStyle20;
            this.xtargetParcelTotalDataGridViewTextBoxColumn.HeaderText = "Target Price NV";
            this.xtargetParcelTotalDataGridViewTextBoxColumn.MinimumWidth = 100;
            this.xtargetParcelTotalDataGridViewTextBoxColumn.Name = "xtargetParcelTotalDataGridViewTextBoxColumn";
            this.xtargetParcelTotalDataGridViewTextBoxColumn.ToolTipText = "Target Price Net Value";
            // 
            // xTargetNetProfitAmt
            // 
            this.xTargetNetProfitAmt.DataPropertyName = "TargetNetProfitAmt";
            dataGridViewCellStyle21.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle21.Format = "N2";
            dataGridViewCellStyle21.NullValue = "0";
            this.xTargetNetProfitAmt.DefaultCellStyle = dataGridViewCellStyle21;
            this.xTargetNetProfitAmt.HeaderText = "Target NP Amt";
            this.xTargetNetProfitAmt.MinimumWidth = 100;
            this.xTargetNetProfitAmt.Name = "xTargetNetProfitAmt";
            // 
            // xTargetNetProfitPct
            // 
            this.xTargetNetProfitPct.DataPropertyName = "TargetNetProfitPct";
            dataGridViewCellStyle22.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            this.xTargetNetProfitPct.DefaultCellStyle = dataGridViewCellStyle22;
            this.xTargetNetProfitPct.HeaderText = "Target NP Pct";
            this.xTargetNetProfitPct.MinimumWidth = 100;
            this.xTargetNetProfitPct.Name = "xTargetNetProfitPct";
            // 
            // xMarketPriceNetProfitAmt
            // 
            this.xMarketPriceNetProfitAmt.DataPropertyName = "MarketPriceNetProfitAmt";
            dataGridViewCellStyle23.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle23.Format = "N2";
            dataGridViewCellStyle23.NullValue = "0";
            this.xMarketPriceNetProfitAmt.DefaultCellStyle = dataGridViewCellStyle23;
            this.xMarketPriceNetProfitAmt.HeaderText = "Market Price NP Amt";
            this.xMarketPriceNetProfitAmt.MinimumWidth = 100;
            this.xMarketPriceNetProfitAmt.Name = "xMarketPriceNetProfitAmt";
            // 
            // xMarketPriceNetProfitPct
            // 
            this.xMarketPriceNetProfitPct.DataPropertyName = "MarketPriceNetProfitPct";
            dataGridViewCellStyle24.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight;
            dataGridViewCellStyle24.Format = "N2";
            dataGridViewCellStyle24.NullValue = null;
            this.xMarketPriceNetProfitPct.DefaultCellStyle = dataGridViewCellStyle24;
            this.xMarketPriceNetProfitPct.HeaderText = "Market Price NP Pct";
            this.xMarketPriceNetProfitPct.MinimumWidth = 100;
            this.xMarketPriceNetProfitPct.Name = "xMarketPriceNetProfitPct";
            this.xMarketPriceNetProfitPct.ReadOnly = true;
            // 
            // xColumn2
            // 
            this.xColumn2.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
            this.xColumn2.HeaderText = "";
            this.xColumn2.Name = "xColumn2";
            this.xColumn2.ReadOnly = true;
            // 
            // bindingSource1
            // 
            this.bindingSource1.DataSource = typeof(FlatShareTradePlanList);
            // 
            // StrategyGrid
            // 
            this.AutoGenerateColumns = false;
            this.BackgroundColor = System.Drawing.Color.Black;
            this.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this.zquantityDataGridViewTextBoxColumn,
            this.zbuyPricePerShareDataGridViewTextBoxColumn,
            this.zbuyParcelSubtotalDataGridViewTextBoxColumn,
            this.zbuyBrokerageFeeAmountDataGridViewTextBoxColumn,
            this.xbuyParcelTotalDataGridViewTextBoxColumn,
            this.xbreakevenPricePerShareDataGridViewTextBoxColumn,
            this.xtargetPricePerShareDataGridViewTextBoxColumn,
            this.xtargetParcelTotalDataGridViewTextBoxColumn,
            this.xTargetNetProfitAmt,
            this.xTargetNetProfitPct,
            this.xMarketPriceNetProfitAmt,
            this.xMarketPriceNetProfitPct,
            this.xColumn2});
            this.Cursor = System.Windows.Forms.Cursors.Arrow;
            this.MultiSelect = false;
            this.Name = "StrategyGridView";
            this.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken;
            this.RowHeadersVisible = false;
            this.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
            this.Size = new System.Drawing.Size(1193, 401);
            this.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.entryStrategyGridView_CellFormatting);
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this)).EndInit();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.DataGridViewTextBoxColumn zquantityDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn zbuyPricePerShareDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn zbuyParcelSubtotalDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn zbuyBrokerageFeeAmountDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn xbuyParcelTotalDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn xbreakevenPricePerShareDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn xtargetPricePerShareDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn xtargetParcelTotalDataGridViewTextBoxColumn;
        private System.Windows.Forms.DataGridViewTextBoxColumn xTargetNetProfitAmt;
        private System.Windows.Forms.DataGridViewTextBoxColumn xTargetNetProfitPct;
        private System.Windows.Forms.DataGridViewTextBoxColumn xMarketPriceNetProfitAmt;
        private System.Windows.Forms.DataGridViewTextBoxColumn xMarketPriceNetProfitPct;
        private System.Windows.Forms.DataGridViewTextBoxColumn xColumn2;
        private System.Windows.Forms.BindingSource bindingSource1;


    }

当拖动到表单上时,表单会在其 InitializeComponent 内部生成以下内容:

  private StrategyGrid strategyGrid1;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn3;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn4;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn5;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn6;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn7;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn8;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn9;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn10;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn11;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn12;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn13;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn14;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn15;
    private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn28;

不确定它是从哪里读取这些列的“要求”……但这是错误的。它们已经存在于自定义控件中。我想也许可以做一些 AccessModifiers 但似乎无法解决。

【问题讨论】:

  • 代码会有所帮助...
  • 我正试图避免代码转储,因为它是由设计师生成的,因此丑陋而冗长。我希望这对 WinForms 开发人员来说是显而易见的......但如果你坚持......
  • 你能把 DataGridViewAutoGenerateColumns 设置为 false 吗?
  • 这是我的第一个想法,但没有任何改变。另请注意,此行为是设计时。所以没有数据被注入到控件中。
  • 仅在设计时或运行时?你能在运行时计算你的列数,看看会产生什么吗?

标签: c# .net winforms datagridview


【解决方案1】:

您似乎没有在这些列中分配列的DataPropertyName。如果您手动创建了列并将 DataSrouce 分配给数据网格,则将自动生成不匹配的列。在MSDN 上获取有关DataPropertyName 的更多信息和示例

【讨论】:

  • 如果您查看我发布的代码,您会发现我已经分配了 DataPropertyName
  • 那么可能是它与您的 sql 查询字段不匹配。
【解决方案2】:

转到 gridview 属性或 F4 --> 取消选中 Auto Generated Coloumns ="False"

【讨论】:

    【解决方案3】:

    如果你有这样的代码;

                for (int i = 0; i < columnNames.Length; i++)
                {
                    GridName.Columns.Add(columnNames[i], columnNames[i]);
                }
    

    每列只添加一次。我用了一个标志

            if (AddColumnFlag)
            {
                for (int i = 0; i < columnNames.Length; i++)
                {
                    GridName.Columns.Add(columnNames[i], columnNames[i]);
                }
            }
    

    当我在构造函数之外的任何地方调用函数时,将标志设置为 false。 它解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2016-08-28
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      相关资源
      最近更新 更多