c# - 알 수없는 열 개수의 WPF Datagrid를 작성하는 방법
xaml (2)
빌드하고 문자열 배열의 컬렉션에서 WPF 데이터 표를 표시 할 필요가 txt.
문제는 내가 열의 수 즉 하나의 배열에있는 항목의 수를 선험적으로 알지 못한다는 것입니다.
그래서 내 xaml 정의 된
<DataGrid Grid.Row="2" ItemsSource="{Binding Path=Rows}" />
내 View Model에서 채우려고했지만 DataGrid에 빈 행만 표시되므로 배열의 내 컬렉션 (Observable Collection)을 항목 소스로 단순히 놓을 수 없습니다.
같은 방법으로 배열을 생성하기 때문에 Observable 컬렉션에 대한 다른 접근법을 사용할 수도 있습니다.
이것은 내 Observable Collection입니다.
ObservableCollection<string[]> Rows = new ObservableCollection<string[]>;
이 메서드는 컬렉션 채우기
foreach(ListViewItem item in wsettings.lista)
{
TextBlock line = item.Content as TextBlock;
string txt = line.Text;
string[] x = txt.Split(stringSeparators, StringSplitOptions.None);
Rows.Add(x);
}
분할하기 전에 첫 번째 부분은 신경 쓰지 마십시오. 나는 전에 사용했던 텍스트 블록의 목록보기 (내 이유가 있음)에서 내 데이터를 가져온다.
EDIT1 : 코드를 더 읽기 쉽도록 만들었습니다.
EDIT2 : 헤더는 사용자가 설정해야하는 콤보 박스 여야합니다.
.NET에는
DataTable
클래스
가 있습니다.
주요 목적은 관계형 데이터베이스와 통신하는 것이지만 표 형식의 데이터를 저장, 표시 및 편집 (예 : wpf,
DataTable + DataGridView
및 WinForms의
DataTable + DataGridView
하여 .csv / Excel 파일을 읽고 표시 할 수 있습니다.
DataTable 열 (DataColumn)은 런타임에 추가 / 제거 될 수 있으며 DataGrid는 헤더의 Name 속성을 사용하여 DataGrid에 대한 열 (DataGridColumn)을 자동으로 생성합니다 (기본적으로 활성화 됨). 또한 DataTable은 out-of-box 정렬 및 필터링을 지원합니다.
참고 : 새 ItemsSource가 할당되면 DataGrid에서
Columns
지우지 않습니다.
따라서 사전 정의 된 열을 사용하고 자동 생성 기능을 사용할 수도 있습니다.
주 : DataGrid는 기본적으로 DataGridTextColumn을 만듭니다.
보다 복잡한 템플릿이 필요한 경우
AutoGeneratingColumn
이벤트를 통해 프로세스를 가로 챌 수 있습니다 (
예 참조
).
다음은 예제입니다.
암호
public class MyViewModel
{
public DataTable Test { get; set; }
}
public MyWindow()
{
InitializeComponent();
var vm = new MyViewModel
{
Test = new DataTable
{
Columns = {"A", "B", "C"}
}
};
this.DataContext = vm;
}
xaml
<DataGrid AutoGenerateColumns="True"
ItemsSource="{Binding Path=Test.DefaultView}">
<DataGrid.Columns>
<DataGridTextColumn Header="#"/>
</DataGrid.Columns>
</DataGrid>
결과 (일부 값 입력)
컴파일 타임에 열의 수를 모르는 경우 프로그래밍 방식으로 열을 만들어야합니다. 이것은보기에 아주 간단 할 것입니다. 다음 샘플 코드는 아이디어를 제공합니다.
public MainWindow()
{
InitializeComponent();
var viewModel = new ViewModel();
var rows = viewModel.Rows;
int numberOfColumns = rows[0].Length; //assume all string[] have the same length
DataContext = new VM1();
for (int i = 0; i < numberOfColumns; ++i)
{
dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() });
}
dataGrid1.ItemsSource = rows;
}