添加多个datagridview到表单

时间:2014-04-20 12:08:20

标签: c# winforms datagridview

我正在开发一个软件,我需要不同形式的DataGridView。

我创建了它们并使用此方法将它们插入到数组中:

    private DataGridView[] cloneDataGridViews(int posCount, DataGridView dataGridView)
    {
        List<DataGridView> dataGridViewList = new List<DataGridView>();

        for(int i=0;i<posCount;i++)
        {
            DataGridView dgv = new DataGridView(); 
            dgv = dataGridView;
            dataGridViewList.Add(dgv);
        }

        return dataGridViewList.ToArray();
    }

我试图用这段代码向他们展示:

    void GridViewSelectorLoad(object sender, System.EventArgs e)
    {
        this.AutoScroll = true;
        int startY = 30;
        for(int i=0;i<dataGridViewArray.Length;i++)
        {
            int height = dataGridViewArray[i].Height;
            int posY = startY + 10 + i*height;

            Panel pnl = new Panel();
            pnl.Controls.Add(dataGridViewArray[i]);
            dataGridViewArray[i].Parent = pnl;
            pnl.Location = new Point(100,posY);
            pnl.Name = "pnl"+i.ToString();
            pnl.Height = dataGridViewArray[i].Height;
            pnl.Width = dataGridViewArray[i].Width;
            pnl.Parent = this;
            this.Controls.Add(pnl);
        }


    }

但它只显示了一个数据网格视图,如何显示所有这些? 该代码有什么问题?

3 个答案:

答案 0 :(得分:0)

cloneDataGridViews没有克隆数据网格,它多次添加相同的实例:

dgv = dataGridView;

答案 1 :(得分:0)

控件只能有一个父级,但您尝试将DataGridView设置为多个Panel的子级。

for(int i=0;i<posCount;i++)
{
    DataGridView dgv = new DataGridView(); 
    dgv = dataGridView;         // not creating a new instance of DataGridView
    dataGridViewList.Add(dgv);
}

这是导致此行为的Controls.Add()方法的相关部分。

if (value.parent != null)
{
    value.parent.Controls.Remove(value); 
}

您已为每个新DataGridView添加了Panel的单个实例。每次,它的Parent属性都设置为最新的Panel。然后,当您尝试将其添加到下一个Panel时,上面的代码会将其从上一个代码中删除。

如果在循环中创建一个新实例,它可以正常工作。您需要复制您希望在每个新DataGridView实例中拥有的现有DataGridView中的值。

for(int i=0; i<posCount; i++)
{
    DataGridView dgv
        = new DataGridView
          {
              Name = dataGridView.Name,
              DataSource = dataGridView.DataSource,
              ...
          };

    dataGridViewList.Add(dgv);
}

答案 2 :(得分:0)

有人指出,您在代码中复制的所有内容都与列表中每个插槽中相同DGV的旧引用相同。相反,您必须复制列结构和所有单元格的值,如下所示:

    public DataGridView cloneDataGridView(DataGridView oldDGV)
    {
        DataGridView newDGV = new DataGridView();

        foreach (DataGridViewCell cell in oldDGV.Rows[0].Cells)
            newDGV.Columns.Add(new DataGridViewColumn(cell));

        newDGV.Rows.Add(oldDGV.Rows.Count);

        for (int row = 0; row < oldDGV.Rows.Count; row++)
            for (int col = 0; col < oldDGV.Columns.Count; col++)
                newDGV[col, row].Value = oldDGV[col, row].Value;

        return newDGV;
    }

您可以这样称呼它:

    for(int i=0;i<posCount;i++)
    {
        DataGridView dgv = cloneDataGridView(dataGridView); 
        dataGridViewList.Add(dgv);
    }

注意:这段代码假定源DGV中至少有一行。