实现在combobox中输入值得时候,下拉框中可以实时的获取后台数据中对应的数据

感觉英语是硬伤

先前为了实现在combobox中输入值得时候,下拉框中可以实时的获取后台数据中对应的数据,先前一直停留在onSelect和onChange事件中。其实combobox中自带了这个功能

mode:

  

Defines how to load list data when text changed. Set to 'remote' if the combobox loads from server. When set to 'remote' mode, what the user types will be sent as the http request parameter named 'q' to server to retrieve the new data.

设置这个参数为remote,注意最后一句话,当输入新的内容时,会将输入的内容以参数q传递到server端。

 

我的示例:

前台代碼:

<script>

        $(function () {

            $("#cbx").combobox({

                url: 'ashx/comData.ashx?fun=getProvince',

                method:'POST',

                mode: 'remote',

                valueField: 'code',

                textField:'name'

            });

        });

 

    </script>

</head>

<body>

    <div id="cbx"></div>

</body>

後台代碼:

string strQ = string.Empty;

                    if (context.Request["q"] !=null)

                    {

                        strQ = context.Request["q"].ToString();

                    }

 

 

 

 

在WPF实现ComboBox多选可以通过设置ComboBox的IsEditable属性为True,并使用一个TextBlock来显示项,同时在ComboBox的Popup部分添加一个ItemsControl用于显示下拉选项。当用户输入时,我们可以动态地过滤下拉选项。以下是一个简单的实现示例: ```xml <ComboBox IsEditable="True" Text="{Binding SelectedText}" PreviewTextInput="ComboBox_PreviewTextInput" PreviewKeyDown="ComboBox_PreviewKeyDown"> <ComboBox.Template> <ControlTemplate TargetType="{x:Type ComboBox}"> <Grid> <ToggleButton x:Name="ToggleButton" Content="{TemplateBinding SelectionBoxItem}" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"/> <ContentPresenter x:Name="ContentSite" IsHitTestVisible="False" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Margin="3,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Left"/> <Popup x:Name="Popup" IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" StaysOpen="False"> <Grid> <Border x:Name="DropDownBorder" Background="White" BorderThickness="1" BorderBrush="LightGray"> <ScrollViewer> <ItemsControl x:Name="ItemsControl" ItemsSource="{TemplateBinding ItemsSource}" ItemTemplate="{TemplateBinding ItemTemplate}" SelectionMode="Multiple"/> </ScrollViewer> </Border> </Grid> </Popup> </Grid> <ControlTemplate.Triggers> <Trigger Property="HasItems" Value="False"> <Setter Property="Visibility" Value="Collapsed" TargetName="DropDownBorder"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="Gray"/> </Trigger> <DataTrigger Binding="{Binding Path=Text.Length, RelativeSource={RelativeSource Self}}" Value="0"> <Setter Property="SelectedIndex" Value="-1" /> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </ComboBox.Template> </ComboBox> ``` 在ViewModel需要为ComboBox绑定一个ItemsSource和一个SelectedText属性,以及处理PreviewTextInput和PreviewKeyDown事件。在事件处理程序,我们可以动态地过滤下拉选项并更新选项。 ```csharp private ObservableCollection<string> _options = new ObservableCollection<string>(); public ObservableCollection<string> Options { get { return _options; } set { _options = value; OnPropertyChanged(nameof(Options)); } } private string _selectedText; public string SelectedText { get { return _selectedText; } set { _selectedText = value; OnPropertyChanged(nameof(SelectedText)); } } private void ComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { var comboBox = sender as ComboBox; var text = comboBox.Text + e.Text; comboBox.ItemsSource = Options.Where(o => o.ToLower().Contains(text.ToLower())); } private void ComboBox_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { var comboBox = sender as ComboBox; var selectedItems = comboBox.GetSelectedItems<string>(); if (selectedItems.Any()) { SelectedText = string.Join(",", selectedItems); } else { SelectedText = comboBox.Text; } comboBox.IsDropDownOpen = false; } } ``` 注意,在事件处理程序,我们使用了一个扩展方法GetSelectedItems,它可以获取项的值列表。 ```csharp public static class ComboBoxExtensions { public static IEnumerable<T> GetSelectedItems<T>(this ComboBox comboBox) { var items = comboBox.ItemsSource as IEnumerable<T>; if (items == null) yield break; foreach (var item in items) { var container = comboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem; if (container != null && container.IsSelected) { yield return item; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值