<c:if test="${fn:contains(name, searchString)}">

本文介绍了一个使用JSP中的<c:if>标签进行条件判断的示例,具体展示了如何根据表单提交的内容来控制页面元素的状态。

关于<c:if test="${fn:contains(name, searchString)}">

网上举的例子不是很好,我试了好久才成功。

还是我来举个例子吧。

-------------------------------------------------------------------------------------

JSP表单提交页面主要代码:

<form method="post" action="result.jsp">
    <input type="text" name="interest" value="">
    <input type="submit" value="submit">

 </form>

---------------------------------------------------------------------------------------------------

JSP表单接收页面result.jsp主要代码:

<form method="post" action="">
    <input type="checkbox" name="interest" value="音乐" 
    <c:if test="${fn:contains(param.interest,'音乐')}">
    checked="checked"
    </c:if>
    >音乐
    </form>

注:以上代码实现的功能就是,如果接收到的param.interest包含【音乐】

二字,则复选框音乐就会被选中。


-----------------------------------------------------------------------------------------------------

效果截图:

//提交页面



//接收页面


----------------------------------------------------------------------------------------------


您的十分满意是我追求的宗旨。

您的一点建议是我后续的动力。






WPF实现CID含有DPL字符,则按钮显示,反之则按钮不显示,以下代码如何完善 using System; using System.Globalization; using System.Windows; using System.Windows.Data; namespace GrpcAMHSMonitor.Client.Wpf.Converters { public class StringContainsConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string str && parameter is string searchString) { return str.Contains(searchString); } return false; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } } <Window.Resources> <local1:StringContainsConverter x:Key="StringContainsConverter"/> </Window.Resources> <StackPanel Grid.Column="0" Grid.Row="1" Orientation ="Horizontal" Margin="0"> <DataGrid x:Name="dgList" DockPanel.Dock="Left" AutoGenerateColumns = "False" FontSize="12" Width="1500" Margin="0,0,0,10"> <DataGrid.Columns> <DataGridTemplateColumn > <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <Label Content="操作" VerticalAlignment="Center"></Label> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="处理" Foreground="White" BorderBrush="Transparent" Background="#2F2F2F" Click="btnHandle_Click"> <Button.Style> <Style TargetType="Button"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding CID, Converter={StaticResource StringContainsConverter}, ConverterParameter='DPL'}" Value="True"> <Setter Property="IsEnabled" Value="True"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> <DataGridTextColumn IsReadOnly="False" Width="300" Header = "CID" Binding = "{Binding CID}" /> <DataGridTextColumn IsReadOnly="False" Width="120" Header = "Ln" Binding = "{Binding Ln}" /> <DataGridTextColumn IsReadOnly="False" Width="120" Header = "Ze" Binding = "{Binding Ze}" /> <DataGridTextColumn IsReadOnly="False" Width="100" Header = "So." Binding = "{Binding So}" /> <DataGridTextColumn IsReadOnly="False" Width="160" Header = "Sn" Binding = "{Binding Sn}" /> <DataGridTextColumn IsReadOnly="False" Width="340" Header = "PD" Binding = "{Binding PD}" /> <DataGridTextColumn IsReadOnly="False" Width="340" Header = "LD" Binding = "{Binding LD}" /> </DataGrid.Columns> </DataGrid> </StackPanel>
最新发布
08-22
<think>根据用户需求,我们需要在DataGridTemplateColumn中根据CID字段是否包含特定字符串(如"DPL"或"FA")来控制按钮的可见性。由于直接绑定DataGridTemplateColumn的Visibility属性存在困难(因为列不在可视化树中,不继承DataContext),我们可以在DataTemplate中的按钮上使用样式触发器来实现。 解决方案: 1. 在按钮的样式中使用DataTrigger,绑定到当前行的CID属性。 2. 使用转换器(Converter)来检查CID是否包含特定字符串,或者使用多重DataTrigger(但WPF的DataTrigger不支持直接检查字符串包含,所以可能需要转换器或使用多重条件)。 然而,根据用户之前的问题,我们只需要在CID包含"DPL"或"FA"时显示按钮。我们可以通过以下两种方式实现: 方法一:使用转换器(推荐,因为可以处理复杂的逻辑) - 创建一个将CID字符串转换为Visibility的转换器,检查字符串中是否包含"DPL"或"FA"。 方法二:使用多个DataTrigger(如果条件简单,但这里有两个条件,且是“或”关系,所以用转换器更合适) 由于用户之前已经尝试了DataTrigger(但只处理了一个值),现在需要处理两个值,且是“或”关系,所以这里推荐使用转换器。 步骤: 1. 创建字符串到Visibility的转换器,实现IValueConverter接口,在Convert方法中判断输入的字符串是否包含指定的子串(如"DPL"或"FA"),如果包含则返回Visible,否则返回Collapsed。 2. 在XAML中引用这个转换器。 3. 将按钮的Visibility属性绑定到CID,并使用转换器。 但是,用户之前的问题中已经有一个样式触发器,现在我们可以改为使用绑定和转换器,这样更简洁。 修改后的代码示例: 第一步:创建转换器 ```csharp using System; using System.Globalization; using System.Windows; using System.Windows.Data; public class StringContainsToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string cid) { // 如果CID包含"DPL"或者"FA",则返回Visible if (cid.Contains("DPL") || cid.Contains("FA")) { return Visibility.Visible; } } return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } ``` 第二步:在XAML资源中声明转换器 ```xml <Window.Resources> <local:StringContainsToVisibilityConverter x:Key="StringContainsToVisibilityConverter"/> </Window.Resources> ``` 第三步:修改按钮的绑定,使用转换器 ```xml <DataGridTemplateColumn.CellTemplate> <DataTemplate> <!-- 注意:这里我们不再使用样式触发器,而是直接绑定Visibility --> <Button Content="处理" Foreground="White" BorderBrush="Transparent" Background="#2F2F2F" Click="btnHandle_Click" Visibility="{Binding CID, Converter={StaticResource StringContainsToVisibilityConverter}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> ``` 但是,用户之前的代码中按钮默认是Collapsed,然后通过触发器设置为Visible。使用转换器后,我们直接在Visibility绑定上实现了相同的效果。 注意:如果CID可能为null,需要在转换器中处理null的情况。 另外,如果用户希望使用样式触发器(不使用转换器)来实现,可以使用多重条件触发器(MultiDataTrigger),但WPF的MultiDataTrigger要求多个条件同时满足,而这里是“或”关系,所以不适用。因此,转换器是最佳选择。 如果用户坚持使用触发器,可以写两个DataTrigger,但这样会重复: ```xml <Button.Style> <Style TargetType="Button"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding CID}" Value="DPL"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding CID}" Value="FA"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> ``` 但是,上面的代码只有在CID整个字符串等于"DPL"或"FA"时才触发,而用户需要的是包含。所以这样写不能满足要求(因为包含不等于整个字符串等于)。因此,触发器方案无法直接实现“包含”的条件,除非使用转换器。 结论:使用转换器是最灵活且正确的方式。 因此,我们推荐使用转换器方案。 如果用户需要,也可以将转换器扩展,允许传入参数(要检查的字符串)而不是硬编码在转换器中。但根据当前需求,硬编码即可。 最终代码: ```xml <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="处理" Foreground="White" BorderBrush="Transparent" Background="#2F2F2F" Click="btnHandle_Click" Visibility="{Binding CID, Converter={StaticResource StringContainsToVisibilityConverter}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> ``` 注意:如果按钮在CID不包含指定字符串时不可见,那么它也不会响应点击事件,所以用户无法点击,符合要求。 如果用户希望按钮不可见且不占用空间,使用`Visibility="Collapsed"`;如果希望保留空位,则使用`Visibility="Hidden"`。根据需求,这里使用Collapsed即可。 引用说明: 关于DataGridTemplateColumn的绑定问题,引用[2]提到直接绑定列的Visibility是无效的,因为列不在可视化树中。但我们的解决方案是在单元格模板内的按钮上绑定,所以没有问题。 因此,我们采用了在DataTemplate内绑定按钮的Visibility属性的方式,这是可行的。 相关问题: 1. 如何在WPF中实现多条件绑定的值转换器?(例如,需要同时满足多个条件) 2. 当绑定源不是字符串时,转换器如何处理类型转换? 3. 如何实现一个通用的字符串包含检查的转换器(可配置检查哪些子串)?</think>在 WPF 中实现根据 CID 字段是否包含特定字符串(如 "DPL" 或 "FA")来控制按钮的可见性,可以通过以下方案实现: ### 推荐解决方案:使用值转换器(Converter) ```xml <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="处理" Foreground="White" BorderBrush="Transparent" Background="#2F2F2F" Click="btnHandle_Click" Visibility="{Binding CID, Converter={StaticResource ContainsToVisibilityConverter}}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> ``` #### 步骤 1:创建值转换器 ```csharp using System; using System.Globalization; using System.Windows; using System.Windows.Data; public class ContainsToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string cid) { // 检查是否包含 "DPL" 或 "FA" if (cid.Contains("DPL") || cid.Contains("FA")) { return Visibility.Visible; } } return Visibility.Collapsed; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } ``` #### 步骤 2:在 XAML 中声明转换器 ```xml <Window.Resources> <local:ContainsToVisibilityConverter x:Key="ContainsToVisibilityConverter"/> </Window.Resources> ``` ### 备选方案:使用样式触发器(需处理多个条件) ```xml <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Content="处理" Foreground="White" BorderBrush="Transparent" Background="#2F2F2F" Click="btnHandle_Click"> <Button.Style> <Style TargetType="Button"> <Setter Property="Visibility" Value="Collapsed"/> <Style.Triggers> <DataTrigger Binding="{Binding CID}" Value="DPL"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> <DataTrigger Binding="{Binding CID}" Value="FA"> <Setter Property="Visibility" Value="Visible"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> </Button> </DataTemplate> </DataGridTemplateColumn.CellTemplate> ``` ### 关键说明: 1. **值转换器优势**: - 可以处理复杂的字符串匹配逻辑(如部分匹配) - 支持多条件判断(如 "DPL" 或 "FA") - 代码更简洁易维护 2. **触发器方案限制**: - 只能处理精确匹配(如 `Value="DPL"` 要求整个 CID 必须是 "DPL") - 不支持部分匹配(如 "TEST_DPL" 不会被匹配) - 需要为每个条件添加单独触发器 3. **绑定注意事项**: - 确保 DataGrid 的 ItemsSource 正确绑定到数据源 - 每个数据项必须包含 CID 属性 - 建议实现 INotifyPropertyChanged 接口以支持动态更新 ### 工作原理: 当 DataGrid 渲染每一行时: 1. 绑定系统获取当前行的 CID 值 2. 将 CID 值传递给 ContainsToVisibilityConverter 3. 转换器检查 CID 是否包含 "DPL" 或 "FA" 4. 返回 Visibility.Visible(包含)或 Visibility.Collapsed(不包含) 5. 按钮根据返回值显示或隐藏 > 此方案通过值转换器实现灵活的字符串匹配,解决了 DataGridTemplateColumn 无法直接绑定 Visibility 的问题[^2],同时支持复杂的匹配逻辑[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

friendan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值