2013-04-02 70 views
2

我有一个自定义控件,里面有一个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); 
    } 
} 

回答

0

您的代码是UserControlCustomServerControl组合。

如果你实现一个而不是组合,它可能会容易得多。

我创建了两个控件 - UserControlCustomServerControl

用户控件

放置下拉列表来代替ASPX装载dymaiclally。如果您动态加载,则必须注意控制的持久性。

<%@ 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(); 
    } 
} 
0

在某些情况下,我已将数据集保存在会话变量中。 Whicn可以在回传后引用。是这样的:

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

然后可以参考它,这取决于数据源是该类型(例如,在我使用了确定时代)

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

所以这是真的,我错过了手动恢复数据源,但将这些数据保存到会话中并不是大项目中的好主意。 –

+0

那么如果你需要它来保存,你可以缓存它(如会话示例),或者你可以再次调用数据库来刷新然后重新绑定数据。 –

+0

但是我需要在适当的舞台上做,比如覆盖LoadControlState或LoadViewState ... –

0

这是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(); 
        } 
       } 

试试这个代码: