ASP.Net Custom Control - PullRequest
       20

ASP.Net Custom Control

0 голосов
/ 26 января 2011

Я разрабатываю пользовательский элемент управления, который должен отображать раскрывающийся список в виде составного элемента управления.

Раскрывающийся список заполняется из веб-службы Rest.Проблема, с которой я сталкиваюсь, состоит в том, что в раскрывающемся списке есть только 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()
        {
            ...
        }
}

Ответы [ 2 ]

1 голос
/ 26 января 2011

Вы можете использовать скрытое поле и выполнять итерацию по копии возвращенных опросов следующим образом:

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

Когда вам нужно прочитать из скрытого поля, вы используете String.Split для разделения значений намассивы, использующие ',' в качестве разделителя, и в каждом массиве вы снова разделяете, используя ':'.

В первом разбиении Array1 [0], который будет идентификатором опроса, и Array1 [n! = 0] будетсвойства Survey с id = Array1 [0].Затем массив [n! = 0] будет разделен на Array2.

Я бы предложил обрабатывать пустые значения свойств с пустой строкой или чем-то еще, иначе вы можете получить неравные длины, особенно если вы укажете StringSplitOptions.RemoveEmptyEntries.

Agricfowl

1 голос
/ 26 января 2011

Попробуйте использовать строку join / split для хранения и извлечения различных значений, тогда вам не нужно будет сильно настраивать раскрывающийся список.

Например:

Текст: Некоторое название

Значение: 1 | тестовый тест | 2/12/2010

Это позволит вам хранить столько значений, сколько вы хотите, при условии, что вы выбираете подходящийперсонаж, чтобы присоединиться и разделить на.Я обычно использую панель, как в моем примере выше.

Примечание: Я смотрел на выбранный вами обработчик набора значений, и он нуждается в некоторой настройке.Вы не должны проверять наличие пустого выпадающего списка, вместо этого вы должны вызывать EnsureChildControls () перед каждым получением и установкой вместо этого.Обязательно переопределите метод CreateChildControls () и создайте там элементы управления.

...