WPF 에서 DataGrid 동적 증가 열

4721 단어
WPF 프로젝트 에 서 는 줄 을 추가 하 는 대신 DataGrid 에 동적 으로 열 을 추가 하 기 를 원 합 니 다.예 를 들 어 기 존의 열 이름 은 '규칙 1', '규칙 2' 입 니 다. 그들 은 새로운 규칙 (키 를 누 를 때마다 새로운 열 을 추가) 을 계속 추가 한 다음 에 DataGrid 에 입력 하고 수정 하 기 를 원 합 니 다.그냥 Access 처럼.
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;
    }

좋은 웹페이지 즐겨찾기