Не удалось установить SelectedValue для DropDownList - PullRequest
1 голос
/ 16 сентября 2009

Это продолжение от Заполнение DropDownList внутри повторителя не работает .

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

Вот мой код:

    protected void criteriaScore_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {

        // This event is raised for the header, the footer, separators, and items.
        // Execute the following logic for Items and Alternating Items.
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

            DropDownList ddl = (DropDownList)e.Item.FindControl("ddlRating");
            DataRowView drw = (DataRowView)e.Item.DataItem;

            for (int i = 1; i < 6; i++)
            {
                ddl.Items.Add(new ListItem(i.ToString(), i.ToString()));
            }
            ddl.DataBind(); // <- Not sure if this is needed here.
            ddl.SelectedValue = drw.Row["lvl"].ToString();
        }
    }

drw.Row ["lvl"]. ToString () является значением от 1 до 5.

Я пытался установить SelectedValue и SelectedIndex.

Я тоже пытался

ddl.SelectedValue = Convert.ToString(ddl.Items.FindByText(drw.Row["lvl"].ToString()).Value) ;

У меня заканчиваются идеи.

Ответы [ 2 ]

7 голосов
/ 16 сентября 2009

Ого, ты делаешь этот путь более сложным, чем нужно. Не делайте этого на ItemDataBound, делайте это на свойстве DataBinding элементов управления.

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

<asp:DropDownList runat="server" ID="ddlYourDDL" OnDataBinding="ddlYourDDL_DataBinding">

Затем реализуйте событие OnDataBinding:

protected void ddlYourDDL_DataBinding(object sender, System.EventArgs e)
{
    DropDownList ddl = (DropDownList)(sender);
    for (int i = 1; i < 6; i++)
    {
        ddl.Items.Add(new ListItem(i.ToString(), i.ToString()));
    }

    // Now that the items are all there, set the selected property
    ddl.SelectedValue = Eval("lvl").ToString();
}

Вы должны попытаться выполнить привязку данных на уровне управления вместо того, чтобы искать что-то, и ваша сетка должна знать, что в ней содержится. Каждый элемент управления может заботиться о себе;)

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

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

0 голосов
/ 16 сентября 2009

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

РЕДАКТИРОВАТЬ: Вот два примера - я предпочитаю сам синтаксис FindByValue ...

YourDDL.ClearSelection();
foreach (ListItem item in YourDDL.Items)
{
   if (item.Value == YourString) 
   { 
      item.Selected = true;
      break;
   }
}


YourDDL.Items.FindByValue("1").Selected = true;
...