如何在某些情况下设置数据表列的宽度以及如何设置数据表列的颜色

时间:2019-06-04 10:44:57

标签: wpf wpf-controls

在xaml.cs文件中(WPF应用程序)我创建了一个3列的DataTable 想要仅在xaml.cs中设置第二列的宽度。 另外,要将第二列的第一行背景色设置为蓝色(仅适用于第一行和第二列中的单元格)。

已创建3列为: DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn(“ ABC”); 同样,增加了2列。

要设置第二列的宽度

1 个答案:

答案 0 :(得分:0)

我不是很确定,如果这是您想要的,但这是我会做的

首先:假设您已经创建了一个基本的DataTable,并用一些值填充了它,例如:

        DataTable dt = new DataTable();
        dt.Columns.Add("Key", typeof(int));
        dt.Columns.Add("Material", typeof(string));
        dt.Columns.Add("Price per Kilo", typeof(int));

        dt.Rows.Add(1, "CobbleStone", 34);
        dt.Rows.Add(2, "Wooden Planks", 12);
        dt.Rows.Add(3, "Iron Ingots", 56);

在调试器中如下所示:

enter image description here

第二:获取一些VisualElement以显示您的数据。我建议使用DataGrid。因此,转到您的MainWindows.xaml,并向DataGrid添加一个Grid,其中包含3个DataGridTextColumns,如下所示:

    <DataGrid>
    </DataGrid>

由于我们要向列中添加自定义属性,因此我们必须向AutoGenerateColumns="False"中添加 <DataGrid AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Key" /> <DataGridTextColumn Header="Material" /> <DataGridTextColumn Header="Price per Kilo" /> </DataGrid.Columns> </DataGrid> ,如果不这样做,则DataGrid将基于其ItemsSource自动生成其列。由于我们现在不会获得任何自动生成的列,因此我们还必须添加3个与DataTable中的3列类似的列:

ItemsSource

第三步:接下来,我们必须设置DataGrid中的DataGrid。不幸的是DataTable无法处理DataTable,因此我们首先必须将DataGrid转换成using System.ComponentModel; using System.Runtime.CompilerServices; class Model : INotifyPropertyChanged { private int m_Key; public int Key { get { return m_Key; } set { m_Key = value; OnPropertyChanged("Key"); } } private string m_Name; public string Name { get { return m_Name; } set { m_Name = value; OnPropertyChanged("Name"); } } private int m_Price; public int Price { get { return m_Price; } set { m_Price = value; OnPropertyChanged("Price"); } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } 可以读取的内容。让我们为此生成一个新的类,并将其命名为 MaterialModel ,如下所示:

DataGrid

它具有属性和PropertyChangedEventHandler,当属性更改时,它们将通知您的VisualElement。

第四: DataTables不接受Lists,但接受ObserableCollectionsList。如果您不想在运行时添加/更改项目,请使用ObserableCollection。我将使用using System.Collections.ObjectModel;,它需要 public partial class MainWindow : Window { private ObservableCollection<MaterialModel> m_MaterialList; public ObservableCollection<MaterialModel> MaterialList { get { return m_MaterialList; } set { m_MaterialList = value; OnPropertyChanged("MaterialList"); } } public MainWindow() { // [...] } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } 起作用。

创建列表的属性,并将PropertyChangedEventHandler添加到MainWindow。

ObservableCollection

下一步是将DataTable转换为 MaterialList = new ObservableCollection<MaterialModel>(); foreach(DataRow row in dt.Rows) { MaterialModel model = new MaterialModel { Key = int.Parse(row["Key"].ToString()), Name = row["Material"].ToString(), Price = int.Parse(row["Price per Kilo"].ToString()), }; MaterialList.Add(model); } ,因此遍历DataTable并将每一行转换为其中一个Model,如下所示:

DataGrid

第五:您的列表中充满了模型,下一步就是告诉您的ItemsSource如何使用列表。首先,将您的列表绑定到DataGrid之后的DataGridTextColumn,然后将每个 <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MaterialList}"> <DataGrid.Columns> <DataGridTextColumn Header="Key" Binding="{Binding Key}" /> <DataGridTextColumn Header="Material" Binding="{Binding Name}" /> <DataGridTextColumn Header="Price per Kilo" Binding="{Binding Price}" /> </DataGrid.Columns> </DataGrid> 绑定到MaterialModel中的一个属性,如下所示:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding MaterialList}">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Key" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Key}" Background="LightBlue"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Material" Binding="{Binding Name}" Width="300" />
            <DataGridTextColumn Header="Price per Kilo" Binding="{Binding Price}"  />
        </DataGrid.Columns>
    </DataGrid>

您将看到DataGrid起作用:

enter image description here

第六步:最后一步是实际设置列的属性,这很容易,您的“需求”将如下所示:

        private double m_SecondColumnWidth;
    public double SecondColumnWidth
    {
        get
        {
            return m_SecondColumnWidth;
        }
        set
        {
            m_SecondColumnWidth = value;
            OnPropertyChanged("SecondColumnWidth");
        }
    }

   public MainWindow()
    {

        SecondColumnWidth = 300;     
   }

我还没有找到一种可以在您想要的地方完全在Code中完全创建DataGrid的方法,但是无论如何,这将是一个坏习惯。 WPF旨在在xaml和c#之间使用此连接。

如果您仍然想在c#中管理列属性,这将是一种正确的方法:

在MainWindow.xaml.cs中:

    <!-- right beneath your Grid -->
    <Grid.Resources>
        <local:ViewModel x:Key="viewModel" />
    </Grid.Resources>

   <DataGridTextColumn Header="Material" Binding="{Binding Name}" Width="{Binding Source={StaticResource viewModel}, Path=SecondColumnWidth}" />

XAML:

{{1}}

这并不是您想要的,但我希望它能以任何方式提供帮助。