6

我想要一个包含重复列的数据网格,如下图所示。

在此处输入图像描述

这只是一个数据网格,列是重复的。我们如何使用 wpf windows datagrid 做到这一点?

谢谢,

4

5 回答 5

3

我尝试通过以下方式解决您的问题。

必须在列中定义一定数量的数据。但是这几个,我们希望他们在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:要使用Bindinga ViewModel,您需要确定适当的列表/集合,将它们设置为元素并将它们组装成单个数据立方体。在我的例子中,静态数据,但是你需要确定数据的来源,数据量,然后将它们放在一边,放在一个数据立方体中。我认为,如果没有数据立方体,将很难实现这种类型的东西(我尝试了不同的选项,使用ConverterBinding直接来自数组等)。

于 2013-07-16T18:10:11.097 回答
2

您不能水平放置 3 个(或更多)数据网格并使用分页绑定数据。我的意思是前 10 个(n)条记录到网格 1,接下来的 10 个(n)条记录到网格 2。

您可以使用LINQ 中提供的SkipTake方法进行分页...

record.Skip((page - 1)*pageSize).Take(pageSize);
于 2013-07-12T19:07:40.807 回答
1

您可以通过手动将重复的列添加到您的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>
于 2013-07-12T12:15:02.057 回答
1

我不太确定您的要求,但如果我是正确的,您希望使用不同的数据重复“相同”列。

你可以做到这一点,但不是你想的那样。这是拥有视图模型的目的,以某种方式封装数据以供您的视图读取。您真正想要的是具有相同标题和样式的列,包括它的项目,但绑定到视图模型中的不同属性。

于 2013-07-16T18:34:46.547 回答
1

你可以这样做:

<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>
于 2013-07-18T08:45:03.113 回答