Строки DataTables кажутся пустым списком С# WPF

Я пытаюсь заполнить ListView пользовательской таблицей данных. Я хочу динамически создавать столбцы и строки из строк (toParse содержит строки, toParse2 содержит имена столбцов). Кажется, это не работает. Когда я запускаю программу, я вижу что-то вроде этого (System.Data.DataRowView): РЕЗУЛЬТАТ

public partial class MainWindow : Window
    {
        ListView items;
        string toParse = "1 12 13\n2 15 16\n3 9 14\n20 123 541235\n4 1234 567";
        string toParse2 = "id value1 value2";
        public MainWindow()
        {
            InitializeComponent();
            items = GenerateListView(10,10);
        }
        public ListView GenerateListView(int posx, int posy)
        {
            ListView listview = new ListView();
            DataTable table = new DataTable();

            string[] columnNames = toParse2.Split(' ');
            foreach (string name in columnNames) table.Columns.Add(name);

            string[] lines = toParse.Split('\n');
            foreach(string line in lines) {
                string[] values = line.Split(' ');

                if (values.Length==columnNames.Length)
                {
                    DataRow row = table.NewRow();
                    table.Rows.Add(row);

                    for (int i=0; i<values.Length; i++)
                    {
                        row[i] = values[i];
                    }
                }
            }
            listview.ItemsSource = table.DefaultView;

            this.grid1.Children.Add(listview);
            return listview;
        }
    } 

Кроме того, когда я отлаживаю таблицу, кажется, что счетчик строк действительно работает, но список равен нулю (?).


person SolisQQ    schedule 01.05.2018    source источник
comment
Не могли бы вы поделиться xaml вашего взгляда?   -  person Saadi    schedule 01.05.2018
comment
‹Grid Name=grid1›‹/Grid› Я сказал, что хочу, чтобы он генерировался динамически в объявлении C#, а не в xaml.   -  person SolisQQ    schedule 01.05.2018
comment
ListView не имеет автоматического механизма для создания макета столбца на основе DataTable. Вы можете создавать столбцы вручную или использовать DataGrid, который может создавать столбцы автоматически.   -  person V.Leon    schedule 01.05.2018
comment
@SolisQQ, я добавил ответ на этот вопрос. Пожалуйста, проверьте его и дайте мне знать, если он работает нормально для вас.   -  person Saadi    schedule 01.05.2018


Ответы (1)


Вам нужно определить столбцы списка. Вы можете использовать GridView для определения столбцов ListView.

Я добавил GridView myGridView = new GridView(); и определил его столбцы с помощью привязки данных.

public partial class MainWindow : Window
    {
        private ListView items;
        private string toParse = "1 12 13\n2 15 16\n3 9 14\n20 123 541235\n4 1234 567";
        private string toParse2 = "id value1 value2";

        public MainWindow()
        {
            InitializeComponent();
            items = GenerateListView(10, 10);
        }

        public ListView GenerateListView(int posx, int posy)
        {
            ListView listview = new ListView();
            DataTable table = new DataTable();
            GridView myGridView = new GridView();

            string[] columnNames = toParse2.Split(' ');
            foreach (string name in columnNames)
            {
                table.Columns.Add(name);

                GridViewColumn gvc = new GridViewColumn();
                gvc.DisplayMemberBinding = new Binding(name);
                gvc.Header = name;
                gvc.Width = 100;

                myGridView.Columns.Add(gvc);
            }
            string[] lines = toParse.Split('\n');
            foreach (string line in lines)
            {
                string[] values = line.Split(' ');

                if (values.Length == columnNames.Length)
                {
                    DataRow row = table.NewRow();
                    table.Rows.Add(row);

                    for (int i = 0; i < values.Length; i++)
                    {
                        row[i] = values[i];
                    }
                }
            }

            listview.View = myGridView;
            listview.ItemsSource = table.DefaultView;

            this.grid1.Children.Add(listview);
            return listview;
        }
    }
person Saadi    schedule 01.05.2018
comment
О, спасибо, все работает отлично :). Я почти отказался от этой идеи и вернулся к listBox со строковым форматом. - person SolisQQ; 01.05.2018
comment
Рад помочь... :) - person Saadi; 01.05.2018