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




datagrid