WPF 에서 DataGrid 동적 증가 열
WPF 의 모든 Items Control 은 1 차원 데이터 구조 만 지원 하고 간단하게 이해 합 니 다. 우리 가 잘 아 는 ListBox, ListView, ComboBox, 심지어 DataGrid 는 한 차원 의 집합 만 지원 합 니 다.왜 DataGrid 에 줄 과 열 이 있 습 니까?사실은 하나의 차원 이 다른 차원 에 포함 되면 2 차원 의 집합 구 조 를 형성 할 수 있 지만 DataGrid 에 있어 서 직접적 으로 조작 할 수 있 는 것 은 1 차원 의 DataGridRow 이다.우 리 는 모든 줄 의 요 소 를 집합 하거나 모든 요 소 를 DataGridRow 에 포장 하여 DataGrid 에 넣 습 니 다.그리고 DataGridRow 에 서 는 각 요소 의 각 속성 을 한층 더 포장 할 수 있 습 니 다. DataGridCell.WPF 에서 DataGrid 의 비 주 얼 트 리 에는 열 이라는 개념 이 전혀 없고 줄 과 칸 만 있다 는 개념 이 있다.따라서 동적 으로 열 을 추가 하려 면 DataGrid 가 표시 되 기 전에 만 증가 합 니 다. 즉, DataGrid 의 논리 트 리 에 만 증가 합 니 다.또는 DataGrid 가 연 결 된 DataTable 의 열 을 동적 으로 추가 한 다음 DataGrid 의 바 인 딩 을 다시 설정 하여 DataGrid 가 데이터 원본 에 따라 자동 으로 열 을 생 성 할 수 있 습 니 다.
그러나 Observable Collection 집합 에는 다이나믹 형식 이 있 습 니 다. 동적 으로 속성 을 추가 할 수 있 습 니 다. 이런 유형 은 속성 을 추가 한 후에 DataGrid 의 ItemsSource 바 인 딩 을 다시 설정 하면 됩 니 다. 이런 방식 은 여러 곳 에서 찾 을 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
 ObservableCollection items = new ObservableCollection();
    public MainWindow()
    {
      InitializeComponent();
 
      for (int i = 0; i < 5; i++)
      {
        dynamic item = new DynamicObjectClass();
        item.A = "Property A value - " + i.ToString();
        item.B = "Property B value - " + i.ToString();
        items.Add(item);
      }
 
      dataGrid.Columns.Add(new DataGridTextColumn() {Header="A", Binding = new Binding("A") });
      dataGrid.Columns.Add(new DataGridTextColumn() {Header="B", Binding = new Binding("B") });
      dataGrid.ItemsSource = items;
    }
 
    private void AddData_Click(object sender, RoutedEventArgs e)
    {
      dynamic item = new DynamicObjectClass();
      item.A="New Item - A";
      item.B="New Item - B";
      items.Add(item);
    }
 
    int newColumnIndex = 1;
    private void AddColumn_Click(object sender, RoutedEventArgs e)
    {
      foreach (DynamicObjectClass item in items)
      {
        item.TrySetMember(new SetPropertyBinder("NewColumn" + newColumnIndex), "New Column Value " + newColumnIndex.ToString());
      }
 
      dataGrid.Columns.Add(new DataGridTextColumn() { Header = "New Column" + newColumnIndex, Binding = new Binding("NewColumn" + newColumnIndex) });
 
      newColumnIndex++;
    }  대응 하 는 클래스 와 대상 은 다음 과 같 습 니 다. 매번 속성 NewColumn 과 그 대응 값 으로 추 가 됩 니 다.
item
A->Property A value 0 B->Property B value 0 NewColumn1-->New Value1
item
A->Property A value 1 B->Property B value 1 NewColumn1-->New Value1
item
A->Property A value 2 B->Property B value 2 NewColumn1-->New Value1
item
A->Property A value 3 B->Property B value 3 NewColumn1-->New Value1
item
A->Property A value 4 B->Property B value 4 NewColumn1-->New Value1
위 를 통 해 실제로 추 가 된 아 이 템 목록 에 있 는 대상 의 속성 과 값 을 알 수 있 습 니 다. 이 를 열 로 본다 면 실제 작업 은 아 이 템 에 대응 하 는 줄 입 니 다.따라서 두 번 째 방식 도 있다. 즉, DataTable 을 데이터 소스 로 선택 하고 DataTable 에 동적 으로 열 을 추가 한 후에 각 줄 의 데 이 터 를 재 구성 하고 DataGrid. ItemsSource = null 을 설정 하 는 것 이다.그리고 아 이 템 소스 를 DataTable 로 다시 설정 합 니 다.코드 는 대략 다음 과 같다.
  DataTable dt = new DataTable();
    public MainWindow()
    {
      InitializeComponent();
 
      dt.Columns.Add(new DataColumn("Column1"));
      dt.Columns.Add(new DataColumn("Column2"));
 
      DataRow dr;
      for (int i = 0; i < 5; i++)
      {
        dr = dt.NewRow();
        for (int columIndex = 0; columIndex < dt.Columns.Count ; columIndex++)
          dr[columIndex] = i.ToString() + " - " + columIndex.ToString();
        dt.Rows.Add(dr);
      }
 
        dataGrid.ItemsSource = dt.DefaultView;
    }
 
    private void AddData_Click(object sender, RoutedEventArgs e)
    {
      DataRow dr = dt.NewRow();
      for (int columIndex = 0; columIndex < dt.Columns.Count; columIndex++)
        dr[columIndex] = "New Row - " + columIndex.ToString();
      dt.Rows.Add(dr);
    }
 
    int newColumnIndex = 1;
    private void AddColumn_Click(object sender, RoutedEventArgs e)
    {
      dt.Columns.Add(new DataColumn("New Column" + newColumnIndex++));
      for (int i = 0; i < dt.Rows.Count; i++)
      {
        dt.Rows[i][dt.Columns.Count - 1] = i.ToString() + " - New Column";
      }
      dataGrid.ItemsSource = null;
      dataGrid.ItemsSource = dt.DefaultView;
    }이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.