我正在开发一个软件,我需要不同形式的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);
}
}
但它只显示了一个数据网格视图,如何显示所有这些? 该代码有什么问题?
答案 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中至少有一行。