【问题标题】:ASP.Net Custom ControlASP.Net 自定义控件
【发布时间】:2011-06-15 19:12:09
【问题描述】:

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

下拉列表是从 Rest 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()
        {
            ...
        }
}

【问题讨论】:

  • stackoverflow.com/questions/2001521/… 可能会为您提供解决此问题的起点。
  • 我如何在 .Net 代码中实现它?
  • 您需要额外的数据在客户端可用还是在服务器上进行处理?
  • 服务器端处理。我需要存储第三个值,我将存储到数据库中,这意味着我不必再次调用其余 Web 服务。
  • 您可以缓存来自 Web 服务的项目并使用 Id (SelectedValue) 从缓存中检索正确的调查实例。

标签: asp.net user-controls controls asp.net-2.0


【解决方案1】:

您可以使用隐藏字段并遍历返回的调查的副本,如下所示:

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

当您需要从隐藏字段中读取时,您可以使用 String.Split 将值分隔为数组,使用 ',' 作为分隔符,并且在每个数组中,使用 ':' 再次拆分。

在第一个拆分 Array1[0] 中,Array1[0] 是调查 id,Array1[n!=0] 将是调查的属性,id = Array1[0]。然后 Array[n!=0] 将被拆分为 Array2。

我建议使用空字符串或其他内容处理空属性值,否则您可能会得到不相等的长度,尤其是在您指定 StringSplitOptions.RemoveEmptyEntries 时。

农家乐

【讨论】:

    【解决方案2】:

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

    例如:

    文本:一些标题

    值:1|testing test|2/12/2010

    这将让您存储任意数量的值,只要您选择合适的角色来加入和拆分。我通常使用栏,如我上面的示例所示。

    旁注:我正在查看您选择的值集处理程序,它需要一些调整。您不应该检查空下拉列表,而是应该在每次获取和设置之前调用 EnsureChildControls()。确保覆盖 CreateChildControls() 方法并在那里创建控件。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2011-12-20
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2010-11-12
      • 2010-09-09
      相关资源
      最近更新 更多