ASP.Net 自定义控件

发布于 2024-10-14 01:20:02 字数 1960 浏览 1 评论 0原文

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

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

I am developing a custom control that needs to display a dropdownlist as a composite control.

The drop down list gets populated from a Rest web service. The problem I am facing is that the dropdownlist only has DataTextField and DataValueField but I need a way of storing more values in the control i.e. I have a couple of other properties I need to access for the selected item.

What is the best way of going about this?

Here is the code I have so far:

    [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()
        {
            ...
        }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

宁愿没拥抱 2024-10-21 01:20:02

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

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] 的调查的属性。然后 Array[n!=0] 将被拆分为 Array2。

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

农禽

You could use a hidden field and iterate thru a copy of the returned Surveys like this:

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

When you need to read from the hidden field, you use String.Split to separate the values into arrays using ',' as the separator and in each array, you split again using ':'.

In the first split Array1[0] who be the survey id and Array1[n!=0] would be the properties of the Survey with the id = Array1[0]. Array[n!=0] would then be split into Array2.

I would suggest handling empty property values with an empty string or something or else you might end up with unequal lengths especially if you specify StringSplitOptions.RemoveEmptyEntries.

Agricfowl

静待花开 2024-10-21 01:20:02

尝试使用字符串连接/拆分来存储和检索各种值,然后您就不必过多自定义下拉列表。

例如:

文本:Some Title

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

只要您选择合适的字符进行连接和拆分,您就可以存储任意数量的值在。我通常使用栏,如上面的示例所示。

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

Try using a string join/split to store and retrieve the various values, then you don't have to customize your dropdown list very much.

For Example:

Text: Some Title

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

This will let you store as many values as you want, so long as you choose an appropriate character to join and split on. I usually use the bar, as in my example above.

Side Note: I was looking at your selected value set handler and it needs some tweaking. You shouldn't check for a null drop down list, instead you should call EnsureChildControls() before each get and set instead. Make sure you override the CreateChildControls() method and create your controls there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文