DropDownList раздражает: то же значение не будет вызывать событие - PullRequest
4 голосов
/ 26 ноября 2008

Я заполнил элемент управления в раскрывающемся списке различными текстовыми свойствами, но каждое текстовое свойство имело ОДНОВРЕМЕННОЕ значение (свойство текста было А, свойства значения - бла, свойство текста - Б, свойства значения - бла-бла и т. Д.) *

ASP.net проверяет только свойства значений при обратной передаче и потому что ВСЕ значения были одинаковыми (для проверка причины) это маленькое раздражающее поведение произошло. Есть ли работа вокруг? Означает ли это, что вы никогда не можете иметь значение, чтобы быть одинаковым?

Ответы [ 6 ]

8 голосов
/ 26 ноября 2008

Похоже, вы работаете над неправильным событием. Попробуйте SelectedIndexChanged .

Убедитесь, что для свойства AutoPostBack установлено значение True.

Решено

ОК, так что я начал копаться в этом, потому что мне было любопытно:)

При связывании данных с неуникальными значениями возникает «проблема».

Итак, во-первых, я публично извиняюсь за то, что сказал иначе.

Для копирования:

ASPX

    <asp:DropDownList ID="myDDL" runat="server" AutoPostBack="True">
    </asp:DropDownList>
    <asp:Label ID="lblSelItem" runat="server"Text="Currently Selected Item: 0"></asp:Label>
    <asp:Label ID="lblSelVal" runat="server" Text="Currently Selected Value: X"></asp:Label>

Code-Behind

    List<string> MyData()
    {
        List<string> rtn = new List<string>();
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!2");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            myDDL.DataSource = MyData();
            myDDL.DataBind();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Display the Currently Selected Item/Value.
        lblSelItem.Text = "Currently Selected Item: " + myDDL.SelectedIndex.ToString();
        lblSelVal.Text = "Currently Selected Value: " + myDDL.SelectedValue;
    }

Выполнить, изменив значения в DropDownList. Обратите внимание, что PostBack не происходит.

Глядя на Источник, я понял, что нам нужно явно установить атрибут "value" для элементов <option>, сгенерированных серверным элементом управления, что заставило меня сделать что-то вроде:

Новый код позади

    Dictionary<string, string> MyTwoColData()
    {
        Dictionary<string, string> rtn = new Dictionary<string, string>();
        rtn.Add("1", "I am the same value!");
        rtn.Add("2", "I am the same value!");
        rtn.Add("3", "I am the same value!");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            Dictionary<string, string> data = MyTwoColData();

            foreach (KeyValuePair<string, string> pair in MyTwoColData())
            {
                myDDL.Items.Add(new ListItem(pair.Value, pair.Key));
            }

            myDDL.DataBind();
        }
    }

Это явно устанавливает значения в «1», «2», «3» и т. Д., Делая их уникальными, в то же время отображая правильные данные в списке.

Очевидно, вы можете изменить это, чтобы работать со списками из одного столбца, но просто проходить через цикл for и использовать значение i или что-то еще.

Что касается хороших обходных путей с DataSets, не уверен.

Реально, мы бы представили пользователю список параметров с точно такими же значениями?

Лично я так не думаю, поэтому, вероятно, эта «проблема» не решена:)

Наслаждайтесь!

PS:

О, я должен также добавить, если вы хотите использовать текстовое значение в "fix", тогда измените его на SelectedItem вместо SelectedValue.

6 голосов
/ 26 ноября 2008

ASP.NET не может различить разные элементы с одинаковыми значениями в раскрывающемся списке, потому что когда браузер отправляет HTTP POST, он отправляет только выбранное значение.

ASP.NET найдет первый элемент в раскрывающемся списке со значением, которое совпадает.

Вы должны убедиться, что каждый элемент в раскрывающемся списке имеет отдельное значение. Вы можете сделать это, добавив ключ к каждому значению. Другими словами, вместо «бла» для каждого значения вы бы использовали «бла-1», «бла-2» и т. Д.

0 голосов
/ 26 ноября 2008

Если вы вспомните предварительные дни ASP.Net, то единственное, что отправляется с отправкой формы из <SELECT>, это VALUE из <OPTION>. Затем ASP.Net эффективно определяет, какой элемент выбран, путем поиска этого значения в списке элементов данных.

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


Если вы сделаете шаг назад и рассмотрите исходный источник данных - как бы вы определили, какое текстовое значение было выбрано, если у вас есть только значение? Как бы вы выбрали это значение из базы данных или из списка? Как бы вы обновили эту строку в базе данных? Если вы попробуете это, вы обнаружите, что .Net выдает исключение, потому что он не может однозначно идентифицировать строку.

Поэтому вам необходимо добавить уникальный ключ к вашим данным.

0 голосов
/ 26 ноября 2008

Вы можете использовать такие значения:

1: 2

2: 2

3: 2

Где второе число является «реальным» значением. Тогда ваше событие должно сработать, и вы сможете проанализировать «реальное» значение в вашем коде.

Почему у вас есть выпадающий, где все значения одинаковы? Или просто некоторые из них одинаковы?

0 голосов
/ 26 ноября 2008

SelectedIndexChanged даже не сработает, поскольку все значения listitem в элементе управления dropdownlist одинаковы. Я немного погуглил. Кажется, это общая проблема. Я еще не нашел работы.

0 голосов
/ 26 ноября 2008

Проблема в том, что если выбранный индекс не изменяется, обратная передача не сработает. В случае, когда пользователь делает такой же выбор, выбранный индекс не изменяется.

Извините, что это не отвечает на вопрос, но, насколько мне известно, объясняет поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...