Во время выполнения добавьте X количество ComboBox с SelectedItem к DataGrid (WPF) - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы создать целую строку ComboBoxes в DataGrid.Я добился определенного прогресса в следующем:

// Declare it
private DataGridComboBoxColumn CreateCustomComboBoxDataSouce(string ColumnName) 
{
    string[] data = { "Date", "LEInt", "String" };
    DataGridComboBoxColumn dgCmbCol = new DataGridComboBoxColumn();
    dgCmbCol.Header = ColumnName;
    dgCmbCol.ItemsSource = data;
    return dgCmbCol;
}

// Later somewhere you can add this to create 20 columns:
for (int i = 0; i < 20; i++)
{
  DataGridComboBoxColumn newColumn = CreateCustomComboBoxDataSouce("Column-" +i);
}
// Sadly nothing is shown unless you manually specify a new row and an
// extra column as done here below, but then you get an extra column.
DataTable table = new DataTable();
table.Columns.Add("|", typeof(string));
table.Rows.Add("");
DataGridCombo.DataContext = table;

XAML сведен к минимуму:

<DataGrid x:Name="DataGridCombo" ItemsSource="{Binding}"   Margin="0,0,0,0" />

Есть ли способ установить значение по умолчанию SelectedValue для каждого ComboBox?В моем цикле for у меня есть доступ к нужной настройке.Кроме того, есть ли способ показать это без добавления дополнительного столбца?Эта DataGrid выровнена с другим DataGrid, у которого не будет этого дополнительного столбца.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

После долгих размышлений об этой проблеме я в итоге пришел к выводу, что то, что я пытался сделать, было либо невозможным, либо неразумным.Я перешел на использование StackPanel с горизонтальной ориентацией.Вот соответствующие фрагменты:

//XAML Layout
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Name="ComboBoxPanel"  Grid.Row="1"  Margin="0,0,0,0"  HorizontalAlignment="Left" />

//Function to create new box and set options
private ComboBox CreateComboBox(string ColumnName, string selectedItem, int width)
{
    string[] data = { "Date", "LEInt", "String" };

    ComboBox dgCmbCol = new ComboBox();
    dgCmbCol.ItemsSource = data;
    dgCmbCol.Name = ColumnName;
    dgCmbCol.Width = width;
    dgCmbCol.SelectedItem = selectedItem;
    dgCmbCol.SelectionChanged += DataTypeSelectionChanged;
    return dgCmbCol;
}

// This reads a JSON file and uses it's options to set the width of all the columns
// for the DataGrid and matches the ComboBoxes to it so they all line up
dynamic TableData = JsonConvert.DeserializeObject(Config.DataLayoutDefinition);
ComboBoxPanel.Children.Clear(); //Since this is run on user interaction, clear old contents.

for (int i = 0; i <  DataGridView.Columns.Count; i++)
{
    int width = TableData.data[i].ColumnWidth;
    if (TableData.data[i].DataType == "String")
    {
        width = 125;
    }
    else if (TableData.data[i].DataType == "Date")
    {
        width = 150;
    }
    else if (TableData.data[i].DataType == "LEInt")
    {
        width = 80;
    }
    else
    {
        width = 100;
    }
ComboBoxPanel.Children.Add(CreateComboBox(TableData.data[i].Column.ToString(), TableData.data[i].DataType.ToString(), width));
    DataGridView.Columns[i].Width = width;

}
0 голосов
/ 14 ноября 2018

Есть ли способ установить значение по умолчанию SelectedValue для каждого ComboBox?

Добавьте DataColumn к DataTable на DataGridComboBoxColumn, а затем установите значение столбца для каждой строки на желаемое выбранное значение:

const int n = 20;
DataTable table = new DataTable();
for (int i = 0; i<n; i++)
{
    string columnName = "Column-" + i;
    DataGridCombo.Columns.Add(CreateCustomComboBoxDataSouce(columnName));
    table.Columns.Add(columnName, typeof(string));
}
table.Rows.Add(new object[n]);
//select some values...
table.Rows[0][1] = "LEInt";
table.Rows[0][5] = "String";
DataGridCombo.DataContext = table;

Кроме того, есть ли способ показать это без добавления дополнительного столбца?

Установите для свойства HorizontalAlignment значение Left, чтобы предотвратить растяжение DataGrid по горизонтали:

<DataGrid x:Name="DataGridCombo" ItemsSource="{Binding}" HorizontalAlignment="Left" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...