0

Мой TT.aspx:не удается получить доступ к DropDownList в EditItemTemplate внутри Gridview

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" AutoGenerateEditButton="true" OnRowEditing="GridView1_RowEditing" > 
    <Columns> 
     <asp:TemplateField> 
     <ItemTemplate> 
      <asp:Literal ID="lit1" Text='<%#Eval("E_Name")%>' runat="server"> 

      </asp:Literal> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:DropDownList ID="Eq" AppendDataBoundItems="true" runat="server" DataSourceID="SqlDataSource2" DataTextField="Name" DataValueField="Name"> 

      </asp:DropDownList> 

     </EditItemTemplate> 

     </asp:TemplateField> 

    </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [E_Name], [Problem], [Solution] FROM [Equipment] WHERE ([O_ID] = @O_ID)"> 
    <SelectParameters> 
     <asp:QueryStringParameter Name="O_ID" QueryStringField="TT" Type="Int32" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT [Name] FROM [Parts]"> 
</asp:SqlDataSource> 

Мои TT.aspx.cs

 protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     Literal xx = (Literal)GridView1.Rows[e.NewEditIndex].FindControl("lit1"); 
     String x = xx.Text; 
     DropDownList x1 = (DropDownList)GridView1.Rows[e.NewEditIndex].FindControl("Eq"); 
     x1.SelectedValue = x; 
    } 

Я новичок в asp.net и я только тестирование с этим кодом. Проблема в том, что второй FindControl("Eq") всегда возвращает null, а первый (для Literal) возвращает правильное значение. Я попытался настроить индекс редактирования gridview на e.NewEditIndex, но, похоже, не работает.

В принципе, я хочу, чтобы пользователь нажимал кнопку «Изменить» в строке, в раскрывающемся списке выбирается исходное значение базы данных, которое находится на ярлыке.

Может ли кто-нибудь провести меня через это, пожалуйста?

+0

проверки этого http://stackoverflow.com/questions/12247279/binding-dropdownlist-inside-gridview-edititemtemplate –

+0

Я уже проверил это, прежде чем просить, но я не Посмотрите, как это связано. Я говорю это, потому что он реализует код в методе 'RowDataBound', пока я реализую его в методе' RowEditing'. Также я уже пробовал «GridView1.EditIndex = e.NewEditIndex;», но это не сработало. Поправьте меня, если я ошибаюсь, пожалуйста. – Mohammad

ответ

0

Событие RowEditing только что приводит к редактированию индекса строки. Вам нужно установить индекс строки редактирования в сетку и переустановить его. И если вам нужно установить значение или нужно связать элемент управления внутри EditItemTemplate, вам нужно сделать это в событии RowDateBound, так как вы будете перевязывать сетку в RowEditing, поэтому событие RowDataBound также предоставит вам элементы управления EditItemTemplate.

Как показано в this answer

protected void gv_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    // grid view's edit index has been changed so rebind it 
    gv.EditIndex = e.NewEditIndex; 
} 

protected void gv_RowDataBound(object sender, GridViewEditEventArgs e) 
{ 
if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
     { 
      ddList.SelectedValue = "set your value here"; 
     } 
    } 
} 
+0

+1, но вам нужно только установить EditIndex, если вы вручную привязываете GridView с использованием свойства DataSource и метода DataBind. Этот ответ будет работать без события RowEditing, перевязывающего GridView. – Sean

+0

Я попробую сейчас, но быстро вопрос; нажав кнопку редактирования, вызовите метод «RowDataBound»? Если нет, то как я могу запрограммировать его программно из метода 'RowEditing'? – Mohammad

+0

Нажатие кнопки редактирования вызовет событие «RowEditing» и событие редактирования строки при восстановлении сетки событие «RowDateBound» будет срабатывать, поскольку @Sean указал, что вы используете свойство DataSource, поэтому вам не нужно будет переустанавливать только что установленную сетку 'EditIndex'' RowDataBound' будет запущен автоматически. –