C# 在Datatable和AutoGeneratedColumns中具有枚举的WPF DataGrid=";“真的”;
我的枚举、datatable和datagrid有问题。我有以下代码: StateEnum.cs:C# 在Datatable和AutoGeneratedColumns中具有枚举的WPF DataGrid=";“真的”;,c#,wpf,datagridview,datatable,enums,C#,Wpf,Datagridview,Datatable,Enums,我的枚举、datatable和datagrid有问题。我有以下代码: StateEnum.cs: public enum StateEnum { Pass, Fail, Mandatory, Retest } MainWindow.xaml.cs: private void Button_Click(object sender, RoutedEventArgs e) { ViewModel.MainView
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);
}
}
private void按钮\u单击(对象发送者,路由目标)
{
ViewModel.MainViewModel vm=VmSingleton.GetVmInstance();
vm.ModuleRecords=新的System.Data.DataTable();
DataTable dt=新的DataTable(“TableName”);
添加(“Id”,typeof(int));
添加(“操作1”,类型(StateEnum));
添加(“操作2”,类型(StateEnum));
添加(“操作3”,类型(StateEnum));
添加(“操作4”,类型(StateEnum));
vm.ModuleRecords=dt;
对于(int i=0;i<5;i++)
{
DataRow newDR=dt.NewRow();
foreach(dt.列中的数据列列列)
{
int j=1;
if(col.ColumnName==“Id”)
newDR[col.ColumnName]=i+j;
其他的
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显示在单元格中,但不会直接显示单元格中的枚举。单击单元格时,我可以选择正确的枚举。我怎样才能修好它
编辑:很抱歉,我的描述模棱两可。在我的例子中,我想显示datatable的数据,因为我不知道在设计时需要显示多少数据。这就是为什么要选择一个数据表。在我的例子中,我可以有更多或更少的操作,但我不知道有多少 我想我在这里发帖之前把我的问题简化得太多了。这个代码示例使它更清晰,我希望:
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...
...
}
private void按钮\u单击(对象发送者,路由目标)
{
DataAccess.DataAccessor accessor=新建DataAccess.DataAccessor();
//我不知道在设计阶段我得到了多少操作
List operationHeaders=accessor.getOperationHeaders();
ViewModel.MainViewModel vm=VmSingleton.GetVmInstance();
vm.ModuleRecords=新的System.Data.DataTable();
DataTable dt=新的DataTable(“TableName”);
添加(“Id”,typeof(int));
//这是因为我必须为每个人都做一个测试
//初始化表的标题的步骤
foreach(operationHeaders中的字符串头)
{
添加(标题,类型(StateEnum));
}
vm.ModuleRecords=dt;
//用数据填充数据表。。。
...
}
我希望现在情况更清楚了
编辑2:我的问题是枚举值的绑定不能正常工作。我在Viewmodel中设置了值,但datagridview中的枚举属性仅显示一个空白单元格。我希望看到枚举属性的值,例如“通过”或“失败”。。。
当我点击一个单元格时,我看到了枚举的可能值,但它不是直接设置的。您不需要使用DataTable,而是使用POCOs,在移动到MVVM时,您的生活会轻松得多。下面的内容要干净得多
我已经复制了完整的Windows代码,因此您可以运行演示而不会遇到问题,但您必须注意xaml导入的名称空间和窗口。参考资料部分:
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;
}
}
}
命名空间WpfApplication1
{
公共枚举状态枚举
{
通过,
失败,
强制性的
重新测试
}
公共类模块记录
{
公共int Id{get;set;}
public StateEnum操作1{get;set;}
public StateEnum操作2{get;set;}
public StateEnum操作3{get;set;}
public StateEnum操作4{get;set;}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
ModuleRecords=新的ObservableCollection();
}
公共ObservableCollection模块记录{get;set;}
私有无效按钮\u单击(对象发送者,路由目标e)
{
对于(int i=0;i<5;i++)
{
int j=1;
var mRecord=新模块记录();
mRecord.Id=j;
mRecord.Operation1=StateEnum.Pass;
mRecord.Operation2=StateEnum.Pass;
mRecord.Operation3=StateEnum.Pass;
mRecord.Operation4=StateEnum.Pass;
模块记录。添加(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>
请花点时间在您的问题中添加一些词语,并尝试更好地解释您的问题。没有人吗?这是解决这个问题的正确策略吗?这个问题清楚吗?:-)很抱歉,但我仍然不明白您的问题是什么。请参阅编辑#2:-)我不知道为什么没有人理解您的问题,因为在我看来也是这样:绑定到WPF DataGrid的DataTable不显示枚举类型的值!哪一部分不清楚?解决办法是什么?你找到了吗?对不起,但我知道我必须更新一下我的答案。(见上文)-我不知道在设计时我必须在datagridview中显示多少操作。这就是为什么我使用datatable。。。