开发工具与关键技术:DataGrid里的复选框
作者:邓崇富
撰写时间:2019 年7 月 27 日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 首先在SQL Server数据库的存储过程中里需要处理一下复选框将要绑定的值。因为数据库保存的数据是true或false,但是当你用存储过程查出来的数据就不是true或false了,而是0或1,而界面要绑定的值是 true或false,而不是0或1。所以要进行转换,转换既可以在存储过程里写,也可以在界面的后台里写,但是为了在界面绑定时方便,我个人建议在存储过程里些比较方便,这样在界面后台绑定复选框时就不用从DataTable里面再一次遍历所有查出来的数据,取出该值作转换,然后再放到DataTable里面去绑定,而在存储过程里转换好之后,在界面后台直接绑定DataGrid表格的数据源即可。
数据库的存储过程的代码如下:
--查询费用种类信息
IF(@Type='UserControl_SelectChargeType')
BEGIN
SELECT
RTRIM(SYS_ScheduleOfChar.ScheduleOfChargesI) as ScheduleOfChargesID,--费用种类ID
RTRIM(SYS_ScheduleOfChar.ChineseName) as ChineseName,--中文名
RTRIM(SYS_ScheduleOfChar.EnglishName) as EnglishName,--英文名
RTRIM(SYS_CurrencyCatego.CurrencyCode) as CurrencyCode,--币种代码
RTRIM(SYS_ScheduleOfChar.TheDefaultCode) as TheDefaultCode,--默认代
RTRIM(SYS_ScheduleOfChar.TheDefaultUP) as TheDefaultUP,--默认单价
<--下面四句是关键关键代码-- >
RTRIM(case when SYS_ScheduleOfChar.Collect = 0 then 'False' else 'True' end) as Collect,--应收
RTRIM(case when SYS_ScheduleOfChar.Payment = 0 then 'False' else 'True' end) as Payment,--应付
RTRIM(case when SYS_ScheduleOfChar.Commission = 0 then 'False' else 'True' end) as Commission,--佣金
RTRIM(case when SYS_ScheduleOfChar.SalesHiding = 0 then 'False' else 'True' end) as SalesHiding --销售隐藏
FROM SYS_ScheduleOfChar
join SYS_CurrencyCatego on SYS_ScheduleOfChar.CurrencyCategoryID = SYS_CurrencyCatego.CurrencyCategoryID
END
在转换时需要用到 case when …then…else…end语句,当查出复选框的字段的值等于0时,然后就返回false否则返回true,最后还可以把这个返回值重命名为界面复选框IsChecked值绑定的路径的名称。
下面是界面后台查询复选框的数据的方法(注意:省略了服务端的代码):
/// <summary>
/// 表格查询
/// </summary>
private void SelectdgAccountManage()
{
//执行方法返回数据
DataTable dt = myClient.UC_SelectChargeType().Tables[0];
//绑定表格数据
dgData.ItemsSource = dt.DefaultView;
//禁用删除按钮初始化
btn_Delete.IsEnabled = false;
btn_Delete.Opacity = 0.3;
//禁用保存按钮
btn_Save.IsEnabled = false;
btn_Save.Opacity = 0.3;
}
说明:DataTable dt = myClient.UC_SelectChargeType().Tables[0];这句代码是接收服务端返回的数据;dgData.ItemsSource = dt.DefaultView;这句是把接收到的数据绑定到界面的DataGrid表格,而dgData就是DataGrid表格里的”x:Name”得值。
下面是界面的XAML一个复选框的代码(关键代码):
<DataGridTemplateColumn Width="*">
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="默认单价" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding TheDefaultUP,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" BorderThickness="0">
<TextBox.Resources>
<VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Normal" Text="请输入"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Resources>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
下面是运行后的效果图: