Добавить StackPanel в WPF DataGrid во время выполнения - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть Datagrid, который динамически создается из входящих данных с использованием следующего:

TableData = JObject.Parse(File.ReadAllText(@"Datainfo.json"));
var listCols = new List<DataColumn>();
var rawData = new DataTable();
foreach (dynamic item in TableData.data)
{
    string columnName = item.Column;
    var column = new DataColumn(columnName);
    string DataType = item.DataType;
    if (DataType == "Int" )
    {
        column.DataType = Type.GetType("System.Int32");
    }
    else
    {
        column.DataType = Type.GetType("System.String");
    }
    column.Unique = false;
    column.AllowDBNull = true;
    column.AutoIncrement = false;
    listCols.Add(column);
    rawData.Columns.Add(column);
}

Затем я отправляю его в DataGrid следующим образом:

    DataTable ETL = null;
    ETL = rawData;
    ETL.DefaultView.AllowEdit = true;
    DataGridView.DataContext = ETL;

Я бынапример, добавить StackPanel в каждый столбец, который включает в себя TextBox для имени столбца и раскрывающийся список с различными типами данных.Тогда у него будет опция Apply / Cancel.

Я пытался следовать аналогичным решениям для добавления расширителей в гриды, но я не могу понять, как применить его к DataGrid, так как он не имеетот .Children() до .Add() до.https://www.codeproject.com/Questions/877973/How-Do-I-Add-A-Stackpanel-To-An-Expander-Header-Vi

Есть ли способ сделать то, что я прошу?Я также пытался скрыть строку заголовка и контролировать первые две строки, но затем, когда я попытался загрузить заголовок в столбец Int, я получил ошибку, так что, очевидно, это не очень хорошая идея.

1 Ответ

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

Если вы добавляете это в заголовок столбца, вы должны добавить его в качестве шаблона заголовка.Допустим, это XAML ...

<Window x:Class="testtestz.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        xmlns:local="clr-namespace:testtestz"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <Grid>
        <ListView>
            <ListView.View>
                <GridView x:Name="myGrid">
                    <GridViewColumn Header="Id"/>
                    <GridViewColumn Header="Name"/>
                    <GridViewColumn Header="Date"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

Тогда вы сделаете это в коде позади ...

using System;
using System.Windows;
using System.Windows.Controls;

namespace testtestz
{ 

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);

            var cBox = new FrameworkElementFactory(typeof(ComboBox));

            myGrid.Columns[0].HeaderTemplate = new DataTemplate() { VisualTree = cBox };
        }
    }
}

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

...