【问题标题】:WPF DataGrid with enums in Datatable and AutoGeneratedColummns="True"带有枚举的 WPF DataGrid Datatable 和 AutoGeneratedColummns="True"
【发布时间】:2015-04-18 05:23:11
【问题描述】:

我的枚举、数据表和数据网格有问题。我有以下代码:

StateEnum.cs:

public enum StateEnum
    {
        Pass,
        Fail,
        Mandatory,
        Retest
    }

MainWindow.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ViewModel.MainViewModel vm = VmSingleton.GetVmInstance();
    vm.ModuleRecords = new System.Data.DataTable();

    DataTable dt = new DataTable("TableName");
    dt.Columns.Add("Id",typeof(int));
    dt.Columns.Add("Operation1", typeof(StateEnum));
    dt.Columns.Add("Operation2", typeof(StateEnum));
    dt.Columns.Add("Operation3", typeof(StateEnum));
    dt.Columns.Add("Operation4", typeof(StateEnum));

    vm.ModuleRecords = dt;

    for (int i = 0; i < 5; i++)
    {
        DataRow newDR = dt.NewRow();
        foreach (DataColumn col in dt.Columns)
        {
            int j = 1;
            if (col.ColumnName == "Id")
                newDR[col.ColumnName] = i + j;
            else
                newDR[col.ColumnName] = StateEnum.Pass;
            j++;
        }
        dt.Rows.Add(newDR);
    }
}

MainWindow.xaml

…
<DataGrid Grid.Row="0" ItemsSource="{Binding ModuleRecords}" AutoGenerateColumns="True" />
<Button Grid.Row="1" Content="Ok" Click="Button_Click"/>
…

虽然 Id 显示在单元格中,但单元格中的枚举不直接显示。当我单击一个单元格时,我可以选择正确的枚举。我该如何解决?

编辑:
我很抱歉模棱两可的描述。就我而言,我想显示数据表的数据,因为我不知道在设计时必须显示多少数据。这就是选择数据表的原因。在我的示例中,我可以进行或多或少的操作,但我不知道有多少...

我认为在我在这里发帖之前我已经简化了我的问题。我希望这个代码示例更清楚:

private void Button_Click(object sender, RoutedEventArgs e)
{
    DataAccess.DataAccessor accessor = new DataAccess.DataAccessor();

    // i dont know how much operations i got at design time
    List<string> operationHeaders = accessor.getOperationHeaders();

    ViewModel.MainViewModel vm = VmSingleton.GetVmInstance();
    vm.ModuleRecords = new System.Data.DataTable();

    DataTable dt = new DataTable("TableName");
    dt.Columns.Add("Id",typeof(int));

    // this is because i have to go through with a for-each 
    // to initialize the header of the table
    foreach (string header in operationHeaders)
    {
        dt.Columns.Add(header, typeof(StateEnum));
    }

    vm.ModuleRecords = dt;

    // fil the datatable with data...
    ...
}

我希望现在情况更清楚......

编辑 2:
我的问题是枚举值的绑定不能正常工作。我在 Viewmodel 中设置了值,但 datagridview 中的枚举属性仅显示一个空白单元格。我希望看到枚举属性的值,例如“通过”或“失败”... 当我点击一个单元格时,我会看到枚举的可能值,但它不是直接设置的。

【问题讨论】:

  • 请花一些时间在您的问题中添加一些词,并尝试更好地解释您的问题。
  • 没人?这是解决该问题的正确策略吗?问题是否足够清楚? :-)
  • 抱歉,我还是不明白你的问题是什么。
  • 请参阅编辑#2 :-)
  • 我不知道为什么没有人理解你的问题,因为它在我看来也是如此:绑定到 WPF DataGrid 的 DataTable 不显示枚举类型的值!哪部分不清楚?解决办法是什么?找到了吗?

标签: c# wpf datagridview datatable enums


【解决方案1】:

您不需要使用 DataTable,而是使用 POCO,在迁移到 MVVM 时,您的生活会轻松很多。下面就干净多了。
我已经复制了完整的 Windows 代码,因此您可以运行演示而不会遇到麻烦,但您必须注意 xaml 导入的命名空间和 Window.Resources 部分:

namespace WpfApplication1
{

    public enum StateEnum
    {
        Pass,
        Fail,
        Mandatory,
        Retest
    }

    public class ModuleRecord
    {
        public int Id { get; set; }
        public StateEnum Operation1 { get; set; }
        public StateEnum Operation2 { get; set; }
        public StateEnum Operation3 { get; set; }
        public StateEnum Operation4 { get; set; }
    }


    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ModuleRecords = new ObservableCollection<ModuleRecord>();
        }

        public ObservableCollection<ModuleRecord> ModuleRecords { get; set; }

        private void Button_Click(object sender, RoutedEventArgs e)
        {

            for (int i = 0; i < 5; i++)
            {
                int j = 1;
                var mRecord = new ModuleRecord();
                mRecord.Id = j;
                mRecord.Operation1 = StateEnum.Pass;
                mRecord.Operation2 = StateEnum.Pass;
                mRecord.Operation3 = StateEnum.Pass;
                mRecord.Operation4 = StateEnum.Pass;
                ModuleRecords.Add(mRecord);

            }
            DataContext = this;
        }
    }
}

...还有他们的xaml

<Window x:Class="WpfApplication1.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"
        xmlns:local="clr-namespace:WpfApplication1" 
        xmlns:System="clr-namespace:System;assembly=mscorlib">

    <Window.Resources>
        <ObjectDataProvider x:Key="EnumDataProvider" 
                        MethodName="GetValues" 
                        ObjectType="{x:Type System:Enum}">

            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:StateEnum"/>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>

    </Window.Resources>

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <DataGrid Grid.Row="0" ItemsSource="{Binding ModuleRecords}" AutoGenerateColumns="False">

            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=Id}" Header="Id" />
                <DataGridComboBoxColumn Header="Operation1" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedValueBinding="{Binding Operation1}"  />
                <DataGridComboBoxColumn Header="Operation2" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedValueBinding="{Binding Operation2}"  />
            </DataGrid.Columns>            

        </DataGrid>
        <Button Grid.Row="1" Content="Ok" Click="Button_Click"/>
    </Grid>
</Window>

【讨论】:

  • 对不起,但我知道我必须稍微更新一下我的答案。 (见上文) - 我不知道在设计时我必须在我的 datagridview 中显示多少操作。这就是我使用数据表的原因...
猜你喜欢
  • 2015-07-20
  • 2021-11-30
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多