自定义DataGridView重复列

我通过从DataGridViewinheritance创建了一个自定义的Winforms控件。

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

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

整个想法是控件已经“自我意识”,所以我不需要表单做任何事情。 很明显,我忽略了一些简单的事情,但我的网络比Windows更多,并没有立即突出的原因。

在此处输入图像描述

自定义数据网格:

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,但似乎无法解决它。

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

转到gridview属性或F4 – >取消选中Auto Generated Coloumns =“False”

如果你有这样的代码;

  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]); } } 

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