2013-07-29 3 views
0

У меня есть GridView, в котором клетка заполняются с выпадающим списком, если соблюдены определенные условия:Начала выбран индекс и ряд выпадающего меню в виде сетки

protected void viewThemeTypeAssociationsGridView_OnRowDataBound(Object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.Cells[1].Text == " ") 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      e.Row.Cells[1].Text = "Not Assigned"; 
      DropDownList chooseThemeTypeDropDown = (DropDownList)e.Row.FindControl("chooseThemeTypeDropDown"); 
      chooseThemeTypeDropDown.Visible = true; 
     } 
    } 
} 

Вот картина:

enter image description here

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

я думал что-то вроде этого, но это не работает:

protected void chooseThemeTypeDropDown_OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    DropDownList chooseThemeTypeDropDown = (DropDownList)e.Row.FindControl("chooseThemeTypeDropDown"); 
} 

EDIT: Если это помогает вот GridView:

     <asp:GridView ID="viewThemeTypeAssociationsGridView" runat="server" AutoGenerateColumns="False" 
          BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" 
          CellPadding="3" CellSpacing="2" DataSourceID="SqlDataSource6" OnRowDataBound="viewThemeTypeAssociationsGridView_OnRowDataBound"> 
          <Columns> 
           <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
           <asp:BoundField DataField="Type" HeaderText="Type" SortExpression="Type" /> 
           <asp:TemplateField HeaderText="Choose Theme Type"> 
            <ItemTemplate> 
             <asp:DropDownList ID="chooseThemeTypeDropDown" runat="server" DataTextField="Type" DataValueField="PK_ThemeType" AutoPostBack="true" DataSourceID="SqlDataSource9" CssClass="dropDownList" OnDataBound="chooseThemeTypeDropDown_OnDataBound" Visible="false" OnSelectedIndexChanged="viewProductAssociationsDropDown_OnSelectedIndexChanged"> 
             </asp:DropDownList> 
             <asp:SqlDataSource ID="SqlDataSource9" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
              SelectCommand="SELECT [Type], [PK_ThemeType] FROM [ThemeType] WHERE [Deleted] = 0 ORDER BY [Type] ASC"> 
             </asp:SqlDataSource> 
            </ItemTemplate> 
           </asp:TemplateField> 
          </Columns> 
          <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" /> 
          <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" /> 
          <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" /> 
          <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" /> 
          <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" /> 
          <SortedAscendingCellStyle BackColor="#FFF1D4" /> 
          <SortedAscendingHeaderStyle BackColor="#B95C30" /> 
          <SortedDescendingCellStyle BackColor="#F1E5CE" /> 
          <SortedDescendingHeaderStyle BackColor="#93451F" /> 
         </asp:GridView> 
         <asp:SqlDataSource ID="SqlDataSource6" runat="server" ConnectionString="<%$ ConnectionStrings:ApplicationServices %>" 
          SelectCommand="SELECT [Theme].[Name], [ThemeType].[Type] FROM [Theme] LEFT OUTER JOIN [ThemeType] ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType] JOIN [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme] WHERE ProductTheme.ProductID LIKE @productParam AND ProductTheme.ThemeId = Theme.PK_Theme AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE @assignedParam GROUP BY [Theme].[Name], [ThemeType].[Type] ORDER BY CASE WHEN [ThemeType].[Type] IS NULL THEN 0 ELSE 1 END, [Theme].[Name]"> 
          <SelectParameters> 
           <asp:QueryStringParameter Name="productParam" Type="String" /> 
           <asp:QueryStringParameter Name="assignedParam" Type="String" /> 
          </SelectParameters> 
         </asp:SqlDataSource> 

EDIT 2: Текущий код

protected void chooseThemeTypeDropDown_OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    DropDownList chooseThemeTypeDropDown = sender as DropDownList; 
    if (chooseThemeTypeDropDown != null) 
    { 
     System.Diagnostics.Debug.WriteLine(chooseThemeTypeDropDown.SelectedItem.Value.ToString()); 
    } 
} 

ответ

1

Вам действительно нужно переместить if (e.Row.RowType == DataControlRowType.DataRow) к внешней стороне вашей условной в OnRowDataBound.

Теперь, если вы установите chooseThemeTypeDropDown.AutoPostBack истинно, и установить его для обработки OnSelectedIndexChanged события, вы будете в состоянии найти правильный экземпляр chooseThemeTypeDropDown литье object sender как DropDownList.

Чтобы получить индекс строки, это сложнее. Самый быстрый, но любопытный хакерский способ - добавить rowindex к каждому chooseThemeTypeDropDown ID на мероприятии GridView RowDataBound.

chooseThemeTypeDropDown.ID = chooseThemeTypeDropDown.ID + e.Row.RowIndex;

+0

У меня AutoPostBack установлен верно и в OnSelectedIndexChanged. System.Diagnostics.Debug.WriteLine (chooseThemeTypeDropDown.SelectedItem.Value.ToString()); не приводит к выходу, и когда я меняю индекс, он снова возвращается к обратной передаче. Что я делаю не так? –

+0

Вы отправляете отправителя как DDL, или вы все еще делаете это неправильно, как в своем коде в вопросе? –

+0

Я сделаю еще одно редактирование с помощью моего текущего кода. –

1

sender даст вам контроль, который инициировал событие, например:

protected void chooseThemeTypeDropDown_OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    DropDownList chooseThemeTypeDropDown = sender as DropDownList; 

    // Check to make sure the drop down exists before we try to work with it 
    if(chooseThemeTypeDropDown != null) 
    { 
     // Put logic here to work with drop down list 
    } 
} 
Смежные вопросы