2014-04-20 2 views
1

나는 소프트웨어를 개발 중이며 다른 형식의 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); 
     } 


    } 

그러나 그것은 단지 하나 된 DataGridView를하는 방법을 보여줍니다 나는 그들 모두를 보여줄 수 있습니까?
해당 코드의 문제점은 무엇입니까?

답변

0

을하지만, 여러 Panel의 자식으로 같은 DataGridView을 설정하려는 에스.

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

당신은 각각의 새로운 Panel에 추가 DataGridView의 단일 인스턴스를 가지고있다. 매번 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); 
} 
+0

네 말이 맞아, 나는 단지 참조하고 있다는 것을 알았다. 또한 DataSources를 복제해야합니다. 내가 셀을 선택하면 그 셀이 모든 DataGridview에서 선택됩니다. – YigitOzdemir

0

cloneDataGridViews는이 같은 인스턴스를 여러 번 추가하는 데이터 그리드를 복제되지 않습니다 제어는 하나의 부모를 가질 수

dgv = dataGridView; 
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에서 적어도 하나의 행.