【问题标题】:Add StackPanel to WPF DataGrid at runtime在运行时将 StackPanel 添加到 WPF DataGrid
【发布时间】:2018-11-13 01:50:54
【问题描述】:

我有一个使用以下方法从传入数据动态构建的 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,以及一个包含各种数据类型的下拉列表。然后它会有一个应用/取消选项。

我一直在尝试遵循类似的解决方案来将扩展器添加到网格,但我不知道如何将它应用到 DataGrid,因为它没有 .Children().Add() 到。 https://www.codeproject.com/Questions/877973/How-Do-I-Add-A-Stackpanel-To-An-Expander-Header-Vi

有没有办法做我所要求的?我还尝试隐藏标题行并控制前两行,但是当我尝试将标题加载到 Int 列时,出现错误,因此显然这不是一个好主意。

【问题讨论】:

  • CellTemplate 定义DataGridTemplateColumn

标签: c# wpf datagridview datagrid datagridviewcolumn


【解决方案1】:

如果您将此添加到列标题,则必须将其添加为 HeaderTemplate。 假设这是 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 };
        }
    }
}

这只是展示如何做到这一点。当然,您必须尝试一些布局、大小和类似的东西才能使其达到合理的程度,但我希望它会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多