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;
        }
    }
}

这是一张图片:

在此处输入图像描述

这是在某些行中可见的下拉列表的许多副本。如何访问已更改下拉列表的选定索引以及它在哪一行?

我在想这样的事情,但它不起作用:

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

编辑:如果它有帮助,这里是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>

编辑 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());
    }
}
4

2 回答 2

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
    }
}
于 2013-07-29T20:11:32.347 回答
1

您确实需要将 移到if (e.Row.RowType == DataControlRowType.DataRow)条件 in 的外部OnRowDataBound

现在,如果您设置chooseThemeTypeDropDown.AutoPostBack为 true,并将其设置为处理OnSelectedIndexChanged事件,您将能够chooseThemeTypeDropDown通过强制转换object senderDropDownList.

要获得行索引,那就更难了。最快但有点老套的方法是将 rowindex 附加到GridView事件 chooseThemeTypeDropDown的每个 ID 上。RowDataBound

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

于 2013-07-29T20:14:53.540 回答