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에 따라 라이센스가 부여됩니다.