我想要一个包含重复列的数据网格,如下图所示。
这只是一个数据网格,列是重复的。我们如何使用 wpf windows datagrid 做到这一点?
谢谢,
我尝试通过以下方式解决您的问题。
必须在列中定义一定数量的数据。但是这几个,我们希望他们在DataGrid
.
假设至少大约知道列数和行数。然后是cube
要设置的数据DataGrid
。以下是我的评论示例。
XAML
<Window x:Class="DataGridDynamicAddCol.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
WindowStartupLocation="CenterScreen" ContentRendered="Window_ContentRendered">
<Grid>
<DataGrid Name="DynamicColumnDataGrid" Loaded="DynamicColumnDataGrid_Loaded" AutoGenerateColumns="False"/>
</Grid>
</Window>
Code behind
public partial class MainWindow : Window
{
// Create class with data
// Note: Each parameter contains a list of values for it.
public class Person
{
public Person()
{
FirstName = new List<string>();
SecondName = new List<string>();
Sample = new List<string>();
}
public List<string> FirstName { get; set; }
public List<string> SecondName { get; set; }
public List<string> Sample { get; set; }
}
// Number of columns
const Int32 COLS = 3;
// Number of rows
const Int32 ROWS = 3;
// Number repeats
const Int32 RPTS = 3;
// Array of headers
string[] HeadersArray = new string[COLS]
{
"FirstName",
"SecondName",
"Sample"
};
// Array of values: Depends on the number of columns and rows
// Note: The number of repetitions you can specify smaller amounts of data
// If you specify more, then this place will be empty cells
string[, ,] ValuesArray = new string[, ,]
{
{
{ "Andy", "Caufmann", "Artist"},
{ "Sam", "Fisher", "Spy"},
{ "Ben", "Affleck", "Actor"}
},
{
{ "Jim", "Gordon", "Sniper"},
{ "Maria", "Gray", "Cleaner"},
{ "Katy", "Parry", "Artist"}
},
{
{ "Jack", "Rider", "Hunter"},
{ "Sven", "Vath", "DJ"},
{ "Paul", "Kalkbrenner", "Super DJ"}
}
};
private List<Person> OnePerson;
public MainWindow()
{
InitializeComponent();
}
private void Window_ContentRendered(object sender, EventArgs e)
{
OnePerson = new List<Person>();
// Create the columns
for (int cols = 0; cols < COLS; cols++)
{
OnePerson.Add(new Person());
}
// Create the rows
for (int cols = 0; cols < COLS; cols++)
{
for (int rows = 0; rows < ROWS; rows++)
{
OnePerson[rows].FirstName.Add(ValuesArray[cols, rows, 0]);
OnePerson[rows].SecondName.Add(ValuesArray[cols, rows, 1]);
OnePerson[rows].Sample.Add(ValuesArray[cols, rows, 2]);
}
}
DynamicColumnDataGrid.ItemsSource = OnePerson;
}
private void DynamicColumnDataGrid_Loaded(object sender, RoutedEventArgs e)
{
// Create dynamically the columns and rows
for (int rpts = 0; rpts < RPTS; rpts++ )
{
for (int cols = 0; cols < COLS; cols++)
{
DataGridTextColumn MyTextColumn = new DataGridTextColumn();
MyTextColumn.Header = HeadersArray[cols];
// Binding values from HeadersArray
MyTextColumn.Binding = new Binding(String.Format("{0}[{1}]",
new object[]
{
HeadersArray[cols], rpts
}
));
// Add column in DataGrid
DynamicColumnDataGrid.Columns.Add(MyTextColumn);
}
}
}
}
Output
重复次数 - 3
:
重复次数 - 2
:
如果您指定的重复次数大于它在多维数据集中的次数,您将看到一张图片:
这是很合乎逻辑的,因为相关数据不可用。
Note
:要使用Binding
a ViewModel
,您需要确定适当的列表/集合,将它们设置为元素并将它们组装成单个数据立方体。在我的例子中,静态数据,但是你需要确定数据的来源,数据量,然后将它们放在一边,放在一个数据立方体中。我认为,如果没有数据立方体,将很难实现这种类型的东西(我尝试了不同的选项,使用Converter
,Binding
直接来自数组等)。
您不能水平放置 3 个(或更多)数据网格并使用分页绑定数据。我的意思是前 10 个(n)条记录到网格 1,接下来的 10 个(n)条记录到网格 2。
您可以使用LINQ 中提供的Skip和Take方法进行分页...
record.Skip((page - 1)*pageSize).Take(pageSize);
您可以通过手动将重复的列添加到您的Datagrid
. 标题不需要是唯一的:
<DataGrid ItemsSource="{Binding Path=Contacts}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="header1" Binding="{Binding Name}"/>
<DataGridTextColumn Header="header2" Binding="{Binding Age}"/>
<DataGridTextColumn Header="header1" Binding="{Binding Name}"/>
<DataGridTextColumn Header="header2" Binding="{Binding Age}"/>
</DataGrid.Columns>
</DataGrid>
我不太确定您的要求,但如果我是正确的,您希望使用不同的数据重复“相同”列。
你可以做到这一点,但不是你想的那样。这是拥有视图模型的目的,以某种方式封装数据以供您的视图读取。您真正想要的是具有相同标题和样式的列,包括它的项目,但绑定到视图模型中的不同属性。
你可以这样做:
<Window.Resources>
<Controls:DataGrid x:Key="YourDataGrid" AutoGenerateColumns="False" ItemsSource="{Binding }">
<Controls:DataGrid.Columns>
<Controls:DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" IsReadOnly="True"/>
<Controls:DataGridTextColumn Header="SecondName" Binding="{Binding Path=LastName}" IsReadOnly="True"/>
</Controls:DataGrid.Columns>
</Controls:DataGrid>
<StackPanel Orientation="Horizontal">
<ContentControl Content="{StaticResource YourDataGrid}" DataContext="{Binding Path=FirstDataContext}"></ContentControl>
<ContentControl Content="{StaticResource YourDataGrid}" DataContext="{Binding Path=SecondDataContext}"></ContentControl>
</StackPanel>