DEV控件学习使用之ASPxDropDownEdit

关于这个控件,是一个可以下拉多选的控件,我是感觉比较坑爹的,他前台的取选中项的值一定要触发两次事件才能取到值,也许是我处理的方式不对 ,如有大神知道怎么弄请指教。

我现在有2种方法,一种后台匹配,一种修改官方给我JS,个人倾向于修改JS后台可直接取到所有值组成的字符串,直接进行解析

前台HTML:

<dxe:ASPxDropDownEdit runat="server" ClientInstanceName="checkComboBox" ID="ASPxDropDownEdit1"
        NAME="ASPxDropDownEdit1" SkinID="CheckComboBox">
        <DropDownWindowTemplate>
            <dxe:ASPxListBox Width="100%" ID="listBox" ClientInstanceName="checkListBox" SelectionMode="CheckColumn"
                runat="server" SkinID="CheckComboBoxListBox">
                <ClientSideEvents SelectedIndexChanged="OnListBoxSelectionChanged" />
            </dxe:ASPxListBox>
            <table style="width: 100%">
                <tr>
                    <td align="right">
                        <dxe:ASPxButton ID="ASPxButton1" AutoPostBack="False" runat="server" Text="关闭">
                            <ClientSideEvents Click="function(s, e){ checkComboBox.HideDropDown(); }" />
                        </dxe:ASPxButton>
                    </td>
                </tr>
            </table>
        </DropDownWindowTemplate>
        <ClientSideEvents LostFocus="SynchronizeListBoxValues" ValueChanged="SynchronizeListBoxValues"
            TextChanged="SynchronizeListBoxValues" />
    </dxe:ASPxDropDownEdit>


前台JS:

var textSeparator = ";";
        function OnListBoxSelectionChanged(listBox, args) {
            if (args.index == 0)
                args.isSelected ? listBox.SelectAll() : listBox.UnselectAll();
            UpdateSelectAllItemState();
            UpdateText();
        }
        function UpdateSelectAllItemState() {
            IsAllSelected() ? checkListBox.SelectIndices([0]) : checkListBox.UnselectIndices([0]);
        }
        function IsAllSelected() {
            for (var i = 1; i < checkListBox.GetItemCount(); i++)
                if (!checkListBox.GetItem(i).selected)
                    return false;
            return true;
        }
        function UpdateText() {
            var selectedItems = checkListBox.GetSelectedItems();
            checkComboBox.SetText(GetSelectedItemsText(selectedItems));
        }
        function SynchronizeListBoxValues(dropDown, args) {
            //checkListBox.UnselectAll();
            var texts = dropDown.GetText().split(textSeparator);
            var values = GetValuesByTexts(texts);
            checkListBox.SelectValues(values);
            UpdateSelectAllItemState();
            UpdateText();
        }
        function GetSelectedItemsText(items) {
            var texts = [];
            for (var i = 0; i < items.length; i++)
                if (items[i].index != 0)
                    texts.push(items[i].text);
            return texts.join(textSeparator);
        }
        function GetValuesByTexts(texts) {
            var actualValues = [];
            var value = "";
            for (var i = 0; i < texts.length; i++) {
                value = GetValueByText(texts[i]);
                if (value != null)
                    actualValues.push(value);
            }
            return actualValues;
        }
        function GetValueByText(text) {
            var text = Trim(text).toUpperCase();
            for (var i = 0; i < checkListBox.GetItemCount(); i++)
                if (checkListBox.GetItem(i).text.toUpperCase() == text)
                    return checkListBox.GetItem(i).value;
            return null;
        }
        function Trim(str) {
            return str.replace(/\s*((\S+\s*)*)/, "$1").replace(/((\s*\S+)*)\s*/, "$1");
        }


这是官方提供的JS方法

关于数据绑定,ASPxDropDownEdit他有前台绑定数据源的方式,单个人觉得太麻烦,索性转了个弯不给ASPxDropDownEdit帮数据源,给他模版下的listbox帮数据源虽然没有验证,但我在想这是不是就是我没办法时时取到选中值的原因

后台绑定数据源CS:

/// <summary>
        /// 绑定下拉框
        /// </summary>
        private void BindDataList()
        {
            DataBase db = new DataBase();
            string sql = "select base_bh,base_name from sys_basedata where baseclase_name='01051'";
            try
            {
                DataTable dt = db.ExecuteDataTable(sql);
                if (dt.Rows.Count > 0)
                {
                    ASPxListBox listBox = (ASPxListBox)this.ASPxDropDownEdit1.FindControl("listBox");
                    listBox.DataSource = dt;
                    listBox.TextField = "base_name";
                    listBox.ValueField = "base_bh";
                    listBox.DataBind();

                    ListEditItem item = new ListEditItem("全选", "");
                    listBox.Items.Insert(0, item);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

取值,这是个关键,我没办法取到时时的值,所以用了个笨方法,根据用户选择的项的文本,去数据源中匹配,匹配到了就取出他的值,但这有要求,文本不能重复,后台数据也不能重复,但考虑实际情况,这种事情应该也不太会发生。

匹配选中值的方法:

/// <summary>
        /// 获取选中项的值
        /// </summary>
        /// <param name="selectText">选中的文本</param>
        /// <returns></returns>
        private string GetSelectedValue(string selectText)
        {
            //获取选中的特性分类的项,根据选中项匹配出像对应的值
            ASPxListBox listBox = (ASPxListBox)this.ASPxDropDownEdit1.FindControl("listBox");
            string str = "";

            string[] text = selectText.Split(';');

            for (int i = 0; i < text.Length; i++)
            {
                for (int j = 0; j < listBox.Items.Count; j++)
                {
                    if (listBox.Items[j].Text == text[i])
                    {
                        str += listBox.Items[j].Value + ";";
                    }
                }
            }
            return str;
        }

这样STR中就包含了所有选中项的值

 我又研究了一个新的方法,可以在页面放一个隐藏的控件,如hidden 然后修改官方给我门的其中一个函数

function GetSelectedItemsText(items) {
            var texts = [];
            for (var i = 0; i < items.length; i++)
                if (items[i].index != 0)
                    texts.push(items[i].text);
            return texts.join(textSeparator);
        }


这是原函数 修改如下:

function GetSelectedItemsText(items) {
            var texts = [];
            for (var i = 0; i < items.length; i++)
                if (items[i].index != 0)
                    texts.push(items[i].text);
            document.getElementById("Hidden1").value = GetValuesByTexts(texts);
            return texts.join(textSeparator);
        }


这样hidden1上存放的就是我们选中的值了,然后后台直接读取这个Hidden的文本,进行解析

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值