[英]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 sender
为DropDownList
来找到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.