`

允许空值的下拉框

阅读更多

 

LSComboBoxItem.cs

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Longshine.SLLib.InputControls.LSComboBox.LSNullableComboBox
{
    public class LSComboBoxItem
    {
        /// <summary>
        /// 显示字段 (DisplayMemberPath)
        /// </summary>
        public string DisplayString { get; set; }

        /// <summary>
        /// 选中项 (SelectedValuePath)
        /// </summary>
        public object ItemValue { get; set; }
    }
}

LSComboBoxItemList.cs

using System.Collections.Generic;

namespace Longshine.SLLib.InputControls.LSComboBox.LSNullableComboBox
{
    public class ComboBoxItemList<T> : List<LSComboBoxItem>
    {
        public delegate string GetDisplayString(T t);

        public ComboBoxItemList(bool addEmptyItem, IEnumerable<T> items, GetDisplayString getDisplayString)
        {
            if (addEmptyItem)
            {
                Add(new LSComboBoxItem { DisplayString = "------", ItemValue = null });
            }

            if (items != null)
            {
                foreach (T item in items)
                {
                    Add(new LSComboBoxItem { DisplayString = getDisplayString(item), ItemValue = item });
                }
            }
        }
    }
}

 LSEnhancedComboBox.cs

using System.Windows;
using System.Windows.Controls;

namespace Longshine.SLLib.InputControls
{
    /// <summary>
    /// 有默认空值的下拉框
    /// </summary>
    public class LSEnhancedComboBox : ComboBox
    {
        public static readonly DependencyProperty SelectedValuePathProperty = DependencyProperty.Register("SelectedValuePath", typeof(string), typeof(LSEnhancedComboBox), new PropertyMetadata(new PropertyChangedCallback(SelectedValuePathPropertyChanged)));

        public static readonly DependencyProperty SelectedValueProperty = DependencyProperty.Register("SelectedValue", typeof(object), typeof(LSEnhancedComboBox), new PropertyMetadata(new PropertyChangedCallback(SelectedValuePropertyChanged)));

        public LSEnhancedComboBox()
            : base()
        {
            this.DisplayMemberPath = "DisplayString";
            this.SelectedValuePath = "ItemValue";
            base.SelectionChanged += new SelectionChangedEventHandler(ComboBoxClassic_SelectionChanged);
        }

        protected void ComboBoxClassic_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (SelectedItem != null && !string.IsNullOrEmpty(SelectedValuePath))
            {
                SetValue(LSEnhancedComboBox.SelectedValueProperty, SelectedItem.GetType().GetProperty(SelectedValuePath).GetValue(SelectedItem, null));
            }
        }

        static void SelectedValuePathPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }

        static void SelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            LSEnhancedComboBox cmb = (LSEnhancedComboBox)d;

            foreach (var item in cmb.Items)
            {
                var currentValue = item.GetType().GetProperty(cmb.SelectedValuePath).GetValue(item, null);
                if (currentValue == null && e.NewValue == null)
                {
                    cmb.SelectedItem = item;
                    return;
                }
                if (currentValue != null)
                {
                    if (currentValue.Equals(e.NewValue))
                    {
                        cmb.SelectedItem = item;
                        return;
                    }
                }
            }
            cmb.SelectedIndex = -1;
        }

        public string SelectedValuePath
        {
            get { return (string)GetValue(LSEnhancedComboBox.SelectedValuePathProperty); }
            set { SetValue(LSEnhancedComboBox.SelectedValuePathProperty, value); }
        }

        public object SelectedValue
        {
            get { return GetValue(SelectedValueProperty); }
            set { SetValue(LSEnhancedComboBox.SelectedValueProperty, value); }
        }

    }
}

使用:

<inputcontrols:LSEnhancedComboBox x:Name="cbRYType" Grid.Column="1" Grid.Row="1"/>
 
void cbRYType_Loaded(object sender, RoutedEventArgs e)
        {
            var ws = WcfServiceClientFactory<ComServiceClient, ComService>.CreateServiceClient();
            ws.GetCodeTableDataCompleted += (ss, e2) =>
                {
                    if (e2.Error != null)
                        System.Windows.Browser.HtmlPage.Window.Alert(e2.Error.Message);
                    else
                    {
                        if (e2.Result == null) return;

                        ComboBoxItemList<CodeEntity> dataList = new ComboBoxItemList<CodeEntity>(true,
                                                                     e2.Result,
                                                                     c => c.MC0000);
                        this.cbRYType.ItemsSource = dataList;
                        this.cbRYType.SelectedIndex = 0;
                    }

                };
            ws.GetCodeTableDataAsync("BM_KK");
        }

 界面:

 

 

 

  • 大小: 5.1 KB
分享到:
评论

相关推荐

    风越.net代码生成器 v3.5

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越asp代码生成器 V3.5

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越.Net代码生成器 [FireCode Creator] V1.3 精简版

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越ASP代码生成器 2.4

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越ASP代码生成器FireAspCreatorv2.9.rar

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接批量...

    风越.net代码生成器v2.9

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越ASP代码生成器2.8

    根据数据库字段允许空值状态自动设置输入检测代码 页面皮肤模板设置,根据网页模板快速生成页面 ★ 设置指定字段在编辑信息时为只读状态 字段需要二次输入(如输入两次密码,以验证其正确性) ★ 在列表中直接...

    风越ASP代码生成器 试用版

     4、支持设置允许提交内容的长度、类型(数字、日期、汉字、空值等)的限制条件 ★  5、支持对用户输入内容进行服务器端与客户端JS双重验证 ★  6、支持自动生成多组多级的级联下拉框功能,快速建立如:省、市、...

    风越ASP代码生成器 [FireAsp Creator]

    2、支持从数据表、视图(Access为查询)中读取数据字段  3、支持通过数据表中的组合主键传递参数 ★  4、支持设置允许提交内容的长度、类型(数字、日期、汉字、空值等)的限制条件 ★  5、支持对用户...

    文章管理系统

    6.[纠正]纠正栏目管理中非顶级分类,次页显示模式选择[分类列表2]没提示不允许选择的提示 7.[纠正]纠正部分浏览器后台列表管理的复选框全选失效的BUG 8.[纠正]纠正部分浏览器后台列表管理的多选处理按钮和下拉菜单...

Global site tag (gtag.js) - Google Analytics