简体   繁体   English

在网格视图中获取选定的索引和下拉菜单行

[英]Getting selected index and row of drop down menu inside grid view

I have a gridview in which a cell is populated with a drop down list if certain conditions are met: 我有一个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;
        }
    }
}

Here is a picture: 这是一张图片:

在此输入图像描述

This is many copies of a drop down list what is made visible in certain rows. 这是下拉列表的许多副本,这些副本在某些行中可见。 How do get access to the selected index for the changed dropdown list and which row it is on? 如何访问已更改的下拉列表的选定索引以及它所在的行?

I was thinking something like this but it doesn't work: 我在想这样的东西,但它不起作用:

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

EDIT: If it helps here is the gridview: 编辑:如果它有帮助这里是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: Current code 编辑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());
    }
}

The sender will give you the control that initiated the event, like this: 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
    }
}

You really need to move the if (e.Row.RowType == DataControlRowType.DataRow) to the outside of your conditional in OnRowDataBound . 您确实需要将if (e.Row.RowType == DataControlRowType.DataRow)移动到if (e.Row.RowType == DataControlRowType.DataRow)条件的OnRowDataBound

Now, if you set chooseThemeTypeDropDown.AutoPostBack to true, and set it to handle the OnSelectedIndexChanged event, you'll be able to find the correct instance of chooseThemeTypeDropDown by casting object sender as a DropDownList . 现在,如果将chooseThemeTypeDropDown.AutoPostBack设置为true,并将其设置为处理OnSelectedIndexChanged事件,则可以通过将object senderDropDownList来找到chooseThemeTypeDropDown的正确实例。

To get the row index, that is more difficult. 要获得行索引,这更难。 The quickest, but kinda hacky way, is to append the rowindex to each chooseThemeTypeDropDown ID on the GridView's RowDataBound event. 最快,但有点hacky的方法是将rowindex附加到GridView的RowDataBound事件上的每个chooseThemeTypeDropDown ID。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM