手动添加未在Windows窗体中显示DataGridView的列

时间:2016-05-03 07:22:15

标签: c# datagridview datagridviewcolumn

我有一个带有DataSet源表的DataGridView(CurrentLine)。我添加了一个带有不同数据源的组合框列,工作正常。我尝试添加另一列,但DataGridView拒绝显示它! 我已经尝试通过DataGridViewColumn和DataGridViewTextBoxColumn添加常规列(因为我基本上需要一个只有数字的常规列)。 我尝试将visibility属性设置为true。 似乎没什么用,我不知道为什么。

da1.Fill(Orders, Order);
da2.Fill(Orders, Lines);
da3.Fill(Orders, Products);

CurrentLine.DataSource = Orders.Tables[Lines];
CurrentLine.Columns["fkPrdctnum"].Visible = false;
CurrentLine.Columns["linenum"].Width = 60;
CurrentLine.Columns["linenum"].HeaderText = "Number";
CurrentLine.Columns["linenum"].ReadOnly = true;
CurrentLine.Columns["lineQuantity"].HeaderText = "Quantity";
CurrentLine.Columns["lineQuantity"].Width = 70;
CurrentLine.Columns["linePrdctPrice"].HeaderText = "Unit Price";
CurrentLine.Columns["linePrdctPrice"].Width = 100;

DataGridViewComboBoxColumn prod = new DataGridViewComboBoxColumn();
prod.DataSource = Orders.Tables[Products];
prod.DisplayMember = "prdctName";
prod.ValueMember = "prdctNum";
prod.HeaderText = "Product";
CurrentLine.Columns.Add(prod);
for (int i=0; i<CurrentLine.Rows.Count; i++)
{
int product = Convert.ToInt32(Orders.Tables[Lines].Rows[i][1]); //This loop sets the values of the combobox according to the order lines in the orderline table in the dataset.
CurrentLine.Rows[i].Cells[4].Value = product;
}

DataGridViewColumn LinePrice = new DataGridViewColumn();
LinePrice.HeaderText = "Line Price";
LinePrice.Width = 100;
LinePrice.ReadOnly = true;
CurrentLine.Columns.Add(LinePrice);

为了清楚起见:组合框工作正常,设置其值的循环也可以正常工作。问题似乎与DataGridViewColumn LinePrice有关。

知道发生了什么事吗?为什么一种类型的列(组合框)工作正常但另一种不能?

P.S。我已经切断了关于另一个填充了Order表的DataGridView的代码行,因为那个工作正常并且与我所知道的问题无关。

更新:当我将框移动到组合框列之前时,它突然出现......不确定为什么,但它不是我希望它在DataGridView中的位置。

2 个答案:

答案 0 :(得分:0)

将您的代码更改为:

  DataTable Orders = Orders.Tables[Lines];
CurrentLine.DataSource = Orders;

      for (int i = 0; i < CurrentLine.Rows.Count-1; i++)
              {
                  string product =Orders.Rows[i][1].ToString (); //This loop sets the values of the combobox according to the order lines in the orderline table in the dataset.
                  CurrentLine.Rows[i].Cells[4].Value = product;
              }

              DataColumn LinePrice = new DataColumn("Line Price");
              Orders.Columns.Add(LinePrice);

它应该是有效的

答案 1 :(得分:0)

我使用了你的代码,我在执行代码片段时遇到了以下错误,这增加了&#34; Line Price&#34; column

  

无法添加列,因为其CellType属性为null。

如果之后添加了列已经在DataGridView中添加了行,则可以生成上述错误,因为无法确定单元格类型。

我设法使用下面的代码片段根据您请求的顺序显示列。请尝试添加新行并确认这是否有助于解决您的问题。

        DataGridViewColumn LinePrice = new DataGridViewColumn();
        LinePrice.HeaderText = "Line Price";
        LinePrice.Width = 100;
        LinePrice.ReadOnly = true;
        LinePrice.CellTemplate = new DataGridViewTextBoxCell();    // Define the cell type of the new column
        CurrentLine.Columns.Add(LinePrice);

注意:for循环可以生成错误(@o_weisman也提到了这一点),同时利用i来获取Orders.Rows[i]行。此外,您似乎有一个主try catch块阻止了错误。请检查您的代码,以确保您已相应地实施了错误陷阱。