Как программно создать N столбцов, используя C# с WPF DataGrid - PullRequest
0 голосов
/ 02 марта 2020

Мне нужно создать N столбцов в WPF DataGrid, где каждый столбец header = "i" (i = 1..N), а затем добавить элементы в каждый столбец. У меня возникла проблема, когда я пытался ее реализовать:

for (int i = 0; i < N; i++)
{
    var col = new DataGridTextColumn();
    col.Header = i.ToString();
    col.Binding = new Binding(i.ToString());
    dataGrid.Columns.Add(col);
    dataGrid.Items.Add(new { i = "some txt" });
}

Проблема может быть в строке dataGrid.Items.Add(new { i = "some txt" });, к которой я не знаю, как ее исправить. В этой строке кода IDE сообщает, что i является анонимным типом, i является числом, а не свойством.

Как я могу добавить элементы в столбец в этом случае?

Ответы [ 3 ]

0 голосов
/ 02 марта 2020

Вы можете создать DataTable и добавить свои столбцы в DataTable. Затем установите этот DataTable в качестве источника данных для представления таблицы данных.

DataTable dt = new DataTable();

for(int i = 0; i < numberOfRows; i++){
    DataRow row = dt.NewRow();
    for(int c = 0; c < numberOfColumns; c++){
        row[c] = "Your data here"       
    }
    dt.Rows.Add(row);
}

 MyDataGrid1.DataSource = dt;
0 голосов
/ 02 марта 2020

Привязка к индексу должна иметь формат: [index]. Также вы должны добавить элементы после того, как вы создали столбцы:

for (int i = 0; i < N; i++)
{
    var col = new DataGridTextColumn
    {
        Header = i.ToString(),
        Binding = new Binding("[" + i + "]"),
        IsReadOnly = true,
        Width = new DataGridLength(1, DataGridLengthUnitType.Star)
    };

    dataGrid.Columns.Add(col);
}

var rowData = Enumerable.Range(0, N).ToList();
dataGrid.Items.Add(rowData);

dg

0 голосов
/ 02 марта 2020

Несмотря на то, что я смог построить вашу демонстрацию аналогичным образом (с использованием VS2017), я не вижу в ней такой практичности, поскольку она не показывает ничего, поскольку нет источника привязки определенного типа c, который вы пытаетесь установить в контексте привязки to.

Вместо этого вы можете найти что-то полезное. Если у вас есть коллекция (List, ObservableCollection и т. Д. c.), Которую вы запрашиваете или иным образом заполняете, и вы хотите, чтобы она автоматически создавалась, вы можете сделать это с помощью отражения. Например, у меня есть собственный класс

public class MySamplePerson
{
   public string FirstName {get; set;}
   public string LastName {get; set;}
   public int Age {get; set;}
}

Затем в вашем методе вы готовите список этих вещей

private void PrepareYourGrid()
{
   // build a sample list of the data and I'm populating with 3 entries
   var SampleData = new List<MySamplePerson>();
   SampleData.Add(new MySamplePerson{ FirstName = "Bill", LastName = "Board", Age = 62});
   SampleData.Add(new MySamplePerson{ FirstName = "Eileen", LastName = "Dover", Age = 32 });
   SampleData.Add(new MySamplePerson{ FirstName = "Ben", LastName = "Dover", Age = 33});


   // using reflection, I am taking the first instance within the list,
   // getting the type, and then getting a list of all the properties on that class.
   var pi = SampleData[0].GetType().GetProperties();
   // Now, for each property, go through and create a column
   foreach( var onePI in pi)
   {
      var col = new DataGridTextColumn();
      // header based on the property name and binding to that same column name,
      // not just some fixed "text" value you prove
      col.Header = onePI.Name;
      col.Binding = new Binding(onePI.Name);
      // now add the column to the grid
      MyDataGrid1.Columns.Add(col);
   }

   // Now I can set the ItemsSource for the grid to the list of records I created   
   MyDataGrid1.ItemsSource = SampleData;
}

В моем примере моя сетка данных формы была названа "MyDataGrid1 ». Теперь, если вы запустите, сетка покажет столько строк, сколько у вас есть, и каждое из опубликованных свойств c также будет открыто ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...