2015-09-10 3 views
0

У меня есть раскрывающийся список в элементе управления представлением деталей. Источником данных является таблица SQL с дневным столбцом.ASP Как связать выбранное значение выпадающего списка в подробном представлении

<asp:TemplateField HeaderText="Day of Month: "> 
      <EditItemTemplate> 
       <asp:DropDownList ID="ddlDoM" runat="server" > 
       </asp:DropDownList> 
      </EditItemTemplate> 
      <InsertItemTemplate> 
       <asp:TextBox ID="TextBox6" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:TextBox> 
      </InsertItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label7" runat="server" Text='<%# Bind("dayofthemonth") %>'></asp:Label> 
      </ItemTemplate> 
      <HeaderStyle Font-Bold="True" /> 
</asp:TemplateField> 

Я заполнил выпадающий список номерами 1 - 31 в событии DataBound.

protected void DataView1_DataBound(object sender, EventArgs e) 
{ 
    DropDownList ddlDoM = (DropDownList)Page.FindControl("ctl00$formPlaceHolder$DataView1$ddlDoM"); 
    if (DataView1.CurrentMode == DetailsViewMode.Edit) 
    { 
     for (int i = 1; i < 32; i++) 
     { 
      ListItem item = ListItem.FromString(i.ToString()); 
      ddlDoM.Items.Add(item); 
     } 
    } 
     DataRowView drv = DataView1.DataItem as DataRowView; 
     ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString())); 
    } 
} 

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

ddlDoM.SelectedIndex = ddlDoM.Items.IndexOf(ddlDoM.Items.FindByValue(drv["dayofthemonth"].ToString()));

Как я могу связать DropDownList обновить значение в источнике данных при изменении? Я попытался установить значение выбранного значения на <%# Bind("dayofthemonth") %>, но я получаю исключение OutOfRangeException. Я предполагаю, что список еще не заселен при переключении в режим редактирования.

Любые мысли по этому поводу? Дайте мне знать, если вам нужно больше кода.

+1

Это не имеет ничего делать с классическим ASP - пожалуйста, повторите тег для ASP.NET. – Paul

+0

моя ошибка, спасибо за ловлю –

ответ

0

Попробуйте добавить ControlParameter к вашему UpdateParameters в свой источник данных и убедитесь, что в раскрывающемся списке установлен AutoPostBack, если это необходимо. Вы также можете подумать о том, чтобы заполнить выпадающий список в более раннем событии (например, Page_Init) и оставить значение по умолчанию до тех пор, пока у вас уже есть событие DataBound.

<asp:SqlDataSource ... UpdateCommand=""....> 
    <UpdateParameters> 
     <asp:ControlParameter ControlID="ddlDoM" Name="dayofthemonth" PropertyName="SelectedValue" Type="Int32" /> 
    </UpdateParameters> 
</asp:SqlDataSource> 

Кроме того, если он по-прежнему вызывает проблемы, сейф (но многословен) опция для добавления ListItems непосредственно к DropDownList контроля, потому что они, кажется, статические значения:

<asp:DropDownList ID="ddlDoM" runat="server" AutoPostBack="true"> 
    <asp:ListItem Value="1" /> 
    <asp:ListItem Value="2" /> 
    <asp:ListItem Value="3" /> 
    etc... 
</asp:DropDownList> 
+0

Я выполнил следующие шаги, и теперь я получаю сообщение об ошибке 'Не удалось найти элемент управления 'ddlDoM' в ControlParameter 'dayofthemonth'. 'Может ли это быть потому, что элемент управления отсутствует, если элемент DetailsView не находится в режиме редактирования? Как я могу обойти это? –

+0

@NickOban: Извините, мой исходный код больше касался выбранных параметров, но вы ищете параметры обновления. См. Обновленный ответ. –

+0

Еще раз спасибо, Майкл. Это определенно ближе, но теперь я вернулся к OutOfRangeException. '' ddlDoM 'имеет значение SelectedValue, которое является недопустимым, поскольку оно не существует в списке элементов. Имя параметра: значение 'Я думаю, что это может быть проблемой жизненного цикла. Мне нужно знать, есть ли событие, которое срабатывает перед привязкой данных к ddlDoM, но после его создания (при переключении в режим редактирования). На данный момент я продолжу использовать подробное решение ListItem. –