ascx自定义控件完善版

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SelectOP.ascx.cs" Inherits="ASB.XPON.Page.LabelAndPackManage.SelectOP" %>

<div id="s1" style="float: left;width: 134px;">
    <div>
        <asp:TextBox ID="txtQT" runat="server" Width="86px" Style="display: block; float: left;"> </asp:TextBox>
        <asp:Button ID="btnSearch" runat="server" Text="查询" Style="float: left; height: 26px; line-height: 26px; width: 36px; padding: 0px;" class="btn mbtn" OnClick="BtnSearch_Click" />
    </div>
    <div>
        <select id="leftST" multiple="true" style="width: 128px; height: 100px;" runat="server">
        </select>
    </div>
</div>

<div style="float: left; padding-top: 40px;">
    <div style="height: 20px; margin-left: 8px; margin-right: 8px;">
        <span>==》</span>
    </div>
    <div style="height: 30px; margin-left: 8px; margin-right: 8px;">
        <span>《==</span>
    </div>
</div>

<div id="s2" style="float: left;">
    <div>
        <select  name="leftRT" id="leftRT" runat="server" multiple="true" style="width: 128px; height: 126px;">
        </select>
    </div>
</div>

<input type="hidden" id="leftRTValue" runat="server" />

<script>
    $(function () {
        // 给select1的option加双击事件,移除左边的,给右边添加相应的数据
        var leftST = '<%= leftST.ClientID %>';
        var leftRT = '<%= leftRT.ClientID %>';
        var objRTValue = $('#' +'<%= leftRTValue.ClientID %>');
        $('#' + leftST).dblclick(function () {
            var selected = $('#' + leftST + ' option:selected');
            // document.getElementById(leftST).remove(selected)
            $('#' + leftRT).append(selected);
            objRTValue.val(objRTValue.val() + selected.val()+"");
        });
        // 右边添加相应事件
        $('#' + leftRT).dblclick(function () {
            var selected = $('#' + leftRT + ' option:selected');
            // document.getElementById(leftRT).remove(selected)
            $('#' + leftST).append(selected);
            var RTValue = objRTValue.val();
            objRTValue.val(RTValue.replace(selected.val()+'',''));
        });


    });
</script>

后台代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ASB.XPON.Page.LabelAndPackManage
{
    public partial class SelectOP : System.Web.UI.UserControl
    {
        public delegate DataTable GetDTDelegate();
        public event GetDTDelegate GetDTEvent;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                InitControl();
            }
        }

        // 初始化控件的值
        private void InitControl()
        {
            string SelectOP = GetGetSelectProvinceValue();
            if (!string.IsNullOrEmpty(SelectOP))
            {
                string[] SelectedArray = SelectOP.Split('');
                leftRT.Items.Clear();
                foreach (string option in SelectedArray)
                {
                    leftST.Items.Remove(leftST.Items.FindByValue(option));
                    DataRow dr = DtLSource.Select(ValueBind + "='" + option + "'")[0];
                    leftRT.Items.Add(new ListItem() { Value = dr[ValueBind].ToString(), Text = dr[TextBind].ToString() });
                }
            }
        }
 

        //左边赋值
        private DataTable _DtLSource;
        public DataTable DtLSource
        {
            get => _DtLSource;
            set
            {
                ddlItemTypeBind(value);
                _DtLSource = value;
            }
        }

        //右边赋值
        public DataTable DtRSource
        {
            set
            {
               ddlItemTypeRBind(value);
            }
        }

        // 获取选中的数据
        public string GetGetSelectProvinceValue() => this.leftRTValue.Value.Length>0? this.leftRTValue.Value.Substring(0, this.leftRTValue.Value.Length-1):"";

        public string ValueBind { get; set; }
        public string TextBind { get; set; }

        private void ddlItemTypeBind(DataTable dt)
        {
            this.leftST.DataSource = dt;
            this.leftST.DataTextField = TextBind;
            this.leftST.DataValueField = ValueBind;
            this.leftST.DataBind();
        }

        private void ddlItemTypeRBind(DataTable dt)
        {
            this.leftRT.DataSource = dt;
            this.leftRT.DataTextField = TextBind;
            this.leftRT.DataValueField = ValueBind;
            this.leftRT.DataBind();
        }

        protected void BtnSearch_Click(object o, EventArgs e)
        {
            DataTable dt = GetDTEvent();
            if (dt != null && dt.Rows.Count > 0)
            {
                DataTable dtN = new DataTable();
                dtN.Columns.Add(leftST.DataTextField, typeof(string));
                dtN.Columns.Add(leftST.DataValueField, typeof(string));
                if (!string.IsNullOrWhiteSpace(txtQT.Text))
                {
                    foreach (var dr in dt.Select(leftST.DataTextField + " like '%" + txtQT.Text.Trim() + "%'"))
                    {
                        dtN.Rows.Add(dr[leftST.DataTextField], dr[leftST.DataValueField]);
                    }
                }
                else
                {
                    dtN = dt;
                }
                // 右边处理
                string SelectOP = GetGetSelectProvinceValue();
                leftRT.Items.Clear();
                if (!string.IsNullOrEmpty(SelectOP))
                {
                    string[] SelectedArray = SelectOP.Split('');
                    foreach (string option in SelectedArray)
                    {
                        if ((dtN.Rows.Cast<DataRow>().Where(x => x.Field<string>(leftST.DataValueField) == option)).Count()>0)
                        {
                            dtN.Rows.Remove((DataRow)dtN.Rows.Cast<DataRow>().FirstOrDefault(x => x.Field<string>(leftST.DataValueField) == option));
                        }
                        DataRow dr = DtLSource.Select(ValueBind + "='" + option + "'")[0];
                        leftRT.Items.Add(new ListItem() { Value = dr[ValueBind].ToString(), Text = dr[TextBind].ToString() });
                    }
                }
                 
                dtN.AcceptChanges();
                leftST.DataSource = null;
                TextBind = leftST.DataTextField;
                ValueBind = leftST.DataValueField;
                ddlItemTypeBind(dtN);
            }
            else
            {
                leftST.DataSource = null;
                TextBind = leftST.DataTextField;
                ValueBind = leftST.DataValueField;
            }
        }
    }
}

具体调用

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AscxProject._Default" %>
<%@ Register Src="SelectOP.ascx" TagName="header" TagPrefix="uc1" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <uc1:header ID="SelectOP" runat="server" />
  
     <uc1:header ID="Header1" runat="server" />
    <asp:Button runat="server" Text="获取数据" OnClick="Unnamed_Click" />
</asp:Content>

后台赋值

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

namespace AscxProject
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Text", typeof(string));
            dt.Columns.Add("Value", typeof(string));
            dt.Rows.Add("安徽", "AH");
            dt.Rows.Add("上海", "SH");
            dt.Rows.Add("芜湖", "WH");
            dt.Rows.Add("南京", "NJ");

            this.SelectOP.ValueBind = "Value";
            this.SelectOP.TextBind = "Text";
            this.SelectOP.DtLSource = dt;

            this.SelectOP.GetDTEvent += new ASB.XPON.Page.LabelAndPackManage.SelectOP.GetDTDelegate(GetProvince);


            DataTable dt1 = new DataTable();
            dt1.Columns.Add("Text", typeof(string));
            dt1.Columns.Add("Value", typeof(string));
            dt1.Rows.Add("安徽", "AH");
            dt1.Rows.Add("上海", "SH");
            dt1.Rows.Add("芜湖", "WH");
            dt1.Rows.Add("南京", "NJ");

            this.Header1.ValueBind = "Value";
            this.Header1.TextBind = "Text";
            this.Header1.DtLSource = dt1;

            this.Header1.GetDTEvent += new ASB.XPON.Page.LabelAndPackManage.SelectOP.GetDTDelegate(GetProvince);

        }

        public DataTable GetProvince() {
            DataTable dt = new DataTable();
            dt.Columns.Add("Text", typeof(string));
            dt.Columns.Add("Value", typeof(string));
            dt.Rows.Add("安徽", "AH");
            dt.Rows.Add("上海", "SH");
            dt.Rows.Add("芜湖", "WH");
            dt.Rows.Add("南京", "NJ");

            return dt;
        }

        protected void Unnamed_Click(object sender, EventArgs e)
        {
            this.Response.Write(this.SelectOP.GetGetSelectProvinceValue());
            Response.Flush();
        }
    }
}

效果图

 

 发现一个问题,加runat="server"的控件,每次点一下都会刷新下界面,以后有时间再研究下。

记录下,在aspx中加入这个控件后,下面的js不再实行。在控件的Page_Load里加上这个。

ScriptManager.RegisterStartupScript(Page, this.GetType(), "Refresh", "funcn();", true);

注意下这个key必须是唯一的,跟前台js代码一样,

if (IsPostBack)
{
ScriptManager.RegisterStartupScript(Page, this.GetType(), "Refresh"+ this.ClientID, this.ClientID+"();", true);
InitControl();
}

posted @ 2021-10-10 23:33  vba是最好的语言  阅读(89)  评论(0编辑  收藏  举报