2013-04-02 3 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

Вы код сочетание UserControl и CustomServerControl.

Это может быть намного проще, если вы реализуете его вместо комбинации.

Я создал два органа управления - UserControl и CustomServerControl.

UserControl

Поместите DropDownList в 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.

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

В некоторых случаях я сохранил набор данных в переменной сеанса. На что можно ссылаться после обратной передачи. Что-то вроде этого:

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

Попробуйте этот код:

Смежные вопросы