WPF datagrid设计一个表格 在勾选一个参数时就会生成一列 勾选多个就生成多列

MasterZM 2016-12-14 01:49:30
本人自己在看WPF遇到难题,希望有大神可以帮帮忙!
前端:
<DockPanel>
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">

<CheckBox x:Name="idCheckBox" Content="ID" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<CheckBox x:Name="nameCheckBox" Content="Name" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<CheckBox x:Name="ismaleCheckBox" Content="IsMale" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<CheckBox x:Name="typeCheckBox" Content="Type" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<CheckBox x:Name="siteidCheckBox" Content="SiteID" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<CheckBox x:Name="birthdateCheckBox" Content="BirthDate" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75"/>
<Button x:Name="CheckBox" Content="Search" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="SearchBtn_OnClick"/>
</StackPanel>
<DataGrid x:Name="gridProfucts" AutoGenerateColumns="True" AutoGeneratingColumn="GridProfucts_OnAutoGeneratingColumn">
</DataGrid>
</DockPanel>

后台:
public partial class MainWindow : Window
{
ObservableCollection<Employee> employees = new ObservableCollection<Employee>();

public MainWindow()
{
InitializeComponent();

//数据源
employees.Add(new Employee {
ID = 1,
Name = "Kapil Malhotra",
IsMale = true,
Type = EmployeeType.Normal,
SiteID = new Uri("http://localhost/4322"),
BirthDate = new DateTime(1980, 1, 1)
});
employees.Add(new Employee {
ID = 2,
Name = "George",
IsMale = true,
Type = EmployeeType.Manager,
SiteID = new Uri("http://localhost/4432"),
BirthDate = new DateTime(1980, 2, 1)
});
employees.Add(new Employee {
ID = 3,
Name = "Vicky",
IsMale = false,
Type = EmployeeType.Supervisor,
SiteID = new Uri("http://localhost/4872"),
BirthDate = new DateTime(1980, 3, 1)
});
}
private void SearchBtn_OnClick(object sender, RoutedEventArgs e) //设置 AutoGenerateColumns="False"的一种方法
{
gridProfucts.ItemsSource = null;
gridProfucts.ItemsSource = employees;
//if (idCheckBox.IsChecked == true) {
// var newColumn = new DataGridTextColumn();
// newColumn.Binding = new Binding(nameof(Employee.ID));
// newColumn.Header = nameof(Employee.ID);
// gridProfucts.Columns.Add(newColumn);
//}
}
private void GridProfucts_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Cancel = true;
if (e.Column.Header.ToString() == nameof(Employee.ID)) {
if (idCheckBox.IsChecked == true) {
e.Cancel = false;
}
}
}

public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsMale { get; set; }
public EmployeeType Type { get; set; }
public Uri SiteID { get; set; }
public DateTime BirthDate { get; set; }
}
public enum EmployeeType
{
Normal,
Supervisor,
Manager
}
}
运行后不勾选,查不到任何东西,不生成任何列。勾选ID这个属性后,查看,自动生成一列为ID然后展示其数据!


现在的问题就是,我想写出勾选任何一个属性都会只生成一个属性列;和我选择两个或多个属性时,他也只会生成两个或者多个列。(比如我勾选了ID和Name两个属性只会生成ID和Name两列)

拜托各位大神,如果您懂这方面的东西,请您帮帮我忙,谢谢!谢谢!
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MasterZM 2016-12-15
  • 打赏
  • 举报
回复
引用 8 楼 a6733351018 的回复:
为什么要这样写 这样你每次改变不都要重新生成列么? 直接在加载的时候就把所有列都生成好,然后根据CheckBox有没有被Check更改列的Visible状态不就好惹 _(:3」∠)_
根据CheckBox有没有被Check更改列的Visible状态 这是什么意思啊 我才学WPF不懂 求解释
浴浴兮 2016-12-14
  • 打赏
  • 举报
回复
为什么要这样写 这样你每次改变不都要重新生成列么? 直接在加载的时候就把所有列都生成好,然后根据CheckBox有没有被Check更改列的Visible状态不就好惹 _(:3」∠)_
MasterZM 2016-12-14
  • 打赏
  • 举报
回复
再次感谢楼上的大神!
xinweilee 2016-12-14
  • 打赏
  • 举报
回复
你给出的代码中有六个checkbox啊。。 if (e.Column.Header.ToString() == nameof(Employee.IsMale)) { if (ismaleCheckBox.IsChecked == true) //你的代码里用的是namecheckbox。。。namecheckbox控制的应该是name列,而现在要判断的是ismale列,应该用ismalecheckbox { e.Cancel = false; } } if (e.Column.Header.ToString() == nameof(Employee.Type)) { if (typeCheckBox.IsChecked == true) { e.Cancel = false; } } 首先你要理解代码执行要干什么,在生成列的时候,判断正在生成的列对应的checkbox是否是check状态,是的话继续生成列,不是的话就取消生成列。。
MasterZM 2016-12-14
  • 打赏
  • 举报
回复
引用 2 楼 xinweilee 的回复:
private void GridProfucts_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { e.Cancel = true; if (e.Column.Header.ToString() == nameof(Employee.ID)) { if (idCheckBox.IsChecked == true) { e.Cancel = false; } } if (e.Column.Header.ToString() == nameof(Employee.Name )) { if (nameCheckBox.IsChecked == true) { e.Cancel = false; } } //依次处理检查的checkbox }
引用 4 楼 xinweilee 的回复:
用于判断的checkbox用的是一个吧?难道不是一个checkbox对应一列? if (e.Column.Header.ToString() == nameof(Employee.IsMale)) { if (ismaleCheckBox.IsChecked == true) { e.Cancel = false; } }
就只有一个CheckBox 但是前两个数据都还行 后面的不行了
xinweilee 2016-12-14
  • 打赏
  • 举报
回复
用于判断的checkbox用的是一个吧?难道不是一个checkbox对应一列? if (e.Column.Header.ToString() == nameof(Employee.IsMale)) { if (ismaleCheckBox.IsChecked == true) { e.Cancel = false; } }
MasterZM 2016-12-14
  • 打赏
  • 举报
回复
大神 按你说的方法 在碰到下面的 枚举类型是就不行了 后面的类型也不可以 只有int型和string类型 可以这样子还是我写的有问题呢 if (e.Column.Header.ToString() == nameof(Employee.IsMale)) { if (nameCheckBox.IsChecked == true) { e.Cancel = false; } } if (e.Column.Header.ToString() == nameof(Employee.Type)) { if (nameCheckBox.IsChecked == true) { e.Cancel = false; } }
xinweilee 2016-12-14
  • 打赏
  • 举报
回复
private void GridProfucts_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { e.Cancel = true; if (e.Column.Header.ToString() == nameof(Employee.ID)) { if (idCheckBox.IsChecked == true) { e.Cancel = false; } } if (e.Column.Header.ToString() == nameof(Employee.Name )) { if (nameCheckBox.IsChecked == true) { e.Cancel = false; } } //依次处理检查的checkbox }
MasterZM 2016-12-14
  • 打赏
  • 举报
回复
拜托各位了!来帮忙啊!

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧