在运行时将 StackPanel 添加到 WPF DataGrid
Add StackPanel to WPF DataGrid at runtime
我有一个 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,其中包含一个用于列名称的文本框,以及一个包含各种数据类型的下拉列表。然后它会有一个应用/取消选项。
我一直在尝试按照类似的解决方案将扩展器添加到网格,但我不知道如何将它应用到 DataGrid,因为它没有 .Children()
到 .Add()
到。
https://www.codeproject.com/Questions/877973/How-Do-I-Add-A-Stackpanel-To-An-Expander-Header-Vi
有什么方法可以满足我的要求吗?我还尝试隐藏 header 行并控制前两行,但是当我尝试将 header 加载到 Int 列时,出现错误,所以显然这不是一个好方法想法。
如果要将其添加到列 header,则必须将其添加为 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 };
}
}
}
这只是展示如何操作。当然,您必须尝试一些布局、尺寸和类似的东西才能使其达到合理的程度,但我希望它能有所帮助。
我有一个 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,其中包含一个用于列名称的文本框,以及一个包含各种数据类型的下拉列表。然后它会有一个应用/取消选项。
我一直在尝试按照类似的解决方案将扩展器添加到网格,但我不知道如何将它应用到 DataGrid,因为它没有 .Children()
到 .Add()
到。
https://www.codeproject.com/Questions/877973/How-Do-I-Add-A-Stackpanel-To-An-Expander-Header-Vi
有什么方法可以满足我的要求吗?我还尝试隐藏 header 行并控制前两行,但是当我尝试将 header 加载到 Int 列时,出现错误,所以显然这不是一个好方法想法。
如果要将其添加到列 header,则必须将其添加为 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 };
}
}
}
这只是展示如何操作。当然,您必须尝试一些布局、尺寸和类似的东西才能使其达到合理的程度,但我希望它能有所帮助。