ASP.Net自定义控件

问题描述:

我正在开发一个自定义控件,需要将下拉列表显示为复合控件。ASP.Net自定义控件

从休息Web服务中填充下拉列表。我面临的问题是,下拉列表只有DataTextField和DataValueField,但我需要一种在控件中存储更多值的方法,即我需要访问所选项目的其他一些属性。

这样做的最好方法是什么?

这里是我到目前为止的代码:

[ValidationProperty("SelectedValue")] 
    public class SelectSurveyControl : Panel 
    { 
     private DropDownList ddlSurveys; 

     public string SelectedSurveyId 
     { 
      get 
      { 
       return SelectedValue; 
      } 
     } 

     public string SelectedSurveyJavascriptEmbedCode 
     { 
      get 
      { 
       return this.ddlSurveys.SelectedItem.Attributes[""]; 
      } 
     } 

     public string SelectedValue 
     { 
      get 
      { 
       return ddlSurveys.SelectedValue; 
      } 
      set 
      { 
       if (ddlSurveys == null) 
       { 
        ddlSurveys = new DropDownList(); 
       } 

       ddlSurveys.SelectedValue = value; 
      } 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnInit(e); 

      if (ddlSurveys == null) 
      { 
       ddlSurveys = new DropDownList(); 
      } 

      IList<Survey> surveys = GetSurveys(); 

      this.ddlSurveys.DataSource = surveys; 
      this.ddlSurveys.DataTextField = "title"; 
      this.ddlSurveys.DataValueField = "id"; 

      this.ddlSurveys.DataBind(); 

      ddlSurveys.SelectedValue = this.SelectedValue; 
      ddlSurveys.CssClass = "umbEditorTextFieldMultiple charlimit"; 
      ddlSurveys.Attributes.Add("SurveyId", SelectedSurveyId); 
      ddlSurveys.Attributes.Add("JavascriptEmbedingCode", SelectedSurveyId); 

      this.Controls.Add(ddlSurveys);    
     } 

     public IList<Survey> GetSurveys() 
     { 
      ... 
     } 
} 
+0

http://stackoverflow.com/questions/2001521/html-dropdown-selection-value可能会给你这个问题的出发点。 – DaveParsons 2011-01-26 11:40:50

尝试使用字符串连接/拆分来存储和检索的各个值,那么你不必很自定义您的下拉列表。

例如:

文字:有些题目

值:1 |测试试验| 2010/2/12

这将让你想你保存尽可能多的价值,所以只要你选择一个合适的角色加入和分裂。我通常使用酒吧,就像我上面的例子。

边注:我在看你选定的值集处理程序,它需要一些调整。你不应该检查一个空的下拉列表,而应该在每个get和set之前调用EnsureChildControls()来代替。确保你重写CreateChildControls()方法并在那里创建你的控件。

你可以使用一个隐藏字段和重复通这样返回的调查的副本:

foreach(Survey s in Surveys){ 
string val = s.id + ":" + s.<property1> + ":" + s.<property2>; 
hiddenField.Value += val +","; 
} 

当你需要从隐藏字段读,你用String.Split的值分成数组使用','作为分隔符,在每个数组中,使用':'再次分割。

在第一次拆分Array1 [0]谁是调查ID和Array1 [n!= 0]将是ID = Array1 [0]的Survey的属性。 Array [n!= 0]然后将被分割成Array2。

我会建议使用空字符串或其他东西来处理空的属性值,否则,如果指定StringSplitOptions.RemoveEmptyEntries,则结果可能不相等。

Agricfowl