簡體   English   中英

自定義用戶控制數據源

[英]Custom user control data source

我有一個自定義控件,里面有一個DropDownList,它是由CreateUserControl創建的。 我將數據源直接保存到下拉控件。 頁面回發后,我的綁定數據消失了。 我是否應該以某種棘手的方式保存/恢復綁定數據?

public class EnumDropDownList : UserControl
{
    private readonly DropDownList _ddlSelector;
    private Dictionary<long, string> _dataSource;

    public EnumDropDownList()
    {
        _ddlSelector = new DropDownList();
        _dataSource = new Dictionary<long, string>();
    }


    public object DataSource
    {
        set
        {
            // datasource logic
        }
    }

    public long SelectedValue
    {
        get { return Convert.ToInt64(_ddlSelector.SelectedValue); }
        set { _ddlSelector.SelectedValue = value.ToString(); }
    }

    public override void DataBind()
    {
        _ddlSelector.DataSource = _dataSource;
        _ddlSelector.DataTextField = "Value";
        _ddlSelector.DataValueField = "Key";
        _ddlSelector.DataBind();

        base.DataBind();
    }

    [PermissionSet(SecurityAction.Demand, Name = "Execution")]
    protected override void CreateChildControls()
    {
        Controls.Add(_ddlSelector);
    }
}

在某些情況下,我已將數據集保存在會話變量中。 然后可以在回發之后引用Whicn。 像這樣:

Session.Add("dataSource", _dataSource);//create the session variable

然后,您可以引用它,具體取決於數據源的類型(例如,我使用了datable)

_ddlSelector.DataSource = (DataTable)Session["dataSource"];

您的代碼是UserControlCustomServerControl組合。

如果實施一個而不是組合,則可能會容易得多。

我創建了兩個控件UserControlCustomServerControl

用戶控件

將下拉列表放置到ASPX,而不是動態加載。 如果動態加載,則必須注意控制的持久性。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="EnumDropDownList.ascx.cs"
    Inherits="WebApplication2010.EnumDropDownList" %>
<asp:DropDownList runat="server" ID="DropDownList1" />

public partial class EnumDropDownList : System.Web.UI.UserControl
{
    private Dictionary<long, string> _dataSource;

    public EnumDropDownList()
    {
        _dataSource = new Dictionary<long, string>();
    }

    public Dictionary<long, string> DataSource
    {
        set { _dataSource = value; }
    }

    public long SelectedValue
    {
        get { return Convert.ToInt64(DropDownList1.SelectedValue); }
        set { DropDownList1.SelectedValue = value.ToString(); }
    }

    public override void DataBind()
    {
        DropDownList1.DataSource = _dataSource;
        DropDownList1.DataTextField = "Value";
        DropDownList1.DataValueField = "Key";
        DropDownList1.DataBind();

        base.DataBind();
    }
}

自定義服務器控件(根據您的情況更容易實現)

它基本上繼承了DropDownList Web控件。

public class MyDropDownList : DropDownList
{
    public long SelectedInt64Value
    {
        get { return Convert.ToInt64(SelectedValue); }
        set { SelectedValue = value.ToString(); }
    }

    public Dictionary<long, string> DataSource
    {
        get { return (Dictionary<long, string>)ViewState["DataSource"]; }
        set { ViewState["DataSource"] = value; }
    }

    public override void DataBind()
    {
        foreach (var item in DataSource)
            Items.Add(new ListItem(item.Value, item.Key.ToString()));

        base.DataBind();
    }
}

用法

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="WebApplication2010.WebForm5" %>

<%@ Register Src="EnumDropDownList.ascx" TagName="EnumDropDownList" TagPrefix="uc1" %>
<%@ Register TagPrefix="asp" Namespace="WebApplication2010" Assembly="WebApplication2010" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <uc1:EnumDropDownList ID="EnumDropDownList1" runat="server" />
    <asp:Button runat="server" ID="Button1" Text="Submit" OnClick="Button1_Click" />
    <asp:MyDropDownList id="MyDropDownList1" runat="server" />
    </form>
</body>
</html>

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        Dictionary<long, string> dataSource  = new Dictionary<long, string>();
        dataSource.Add(1, "One");
        dataSource.Add(2, "Two");

        EnumDropDownList1.DataSource = dataSource;
        EnumDropDownList1.DataBind();

        MyDropDownList1.DataSource = dataSource;
        MyDropDownList1.DataBind();
    }
}

這是aspx文件:

                <telerik:RadComboBox ID="cmbCurrency" runat="server" Width="200px" MaxHeight="200px"
                    EmptyMessage="Select a currency" AutoPostBack="true" Filter="Contains" EnableLoadOnDemand="true">
                </telerik:RadComboBox>

這是背后的代碼:

 if (!IsPostBack)
            {
                popCurrencyName();              
            }    

    public void popCurrencyName()
                {
                    DataTable dtCurrency = objCurrencyBAL.getCurrency(long.MinValue);

                    if (dtCurrency.Rows.Count > 0)
                    {
                        cmbCurrency.DataSource = dtCurrency;
                        cmbCurrency.DataTextField = "Name";
                        cmbCurrency.DataValueField = "CurrencyId";
                        cmbCurrency.DataBind();
                    }
                }

試試這個代碼:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM