在网格视图中更改下拉列表项选择单选按钮

change dropdown list item selecting radio button in grid view

picture如果我 selected 男性单选按钮然后在下拉列表中显示不同的选项如果我 select 女性然后在 RowDataBound 方法的帮助下在下拉列表中显示不同的选项。

好的,事实上很多技巧和问题是当您加载现有的数据网格时,我们还必须设置单选按钮选择和下拉列表。

所以,假设我们有这个网格:

        <asp:GridView ID="GHotels" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" cssclass="table" OnRowDataBound="GHotels_RowDataBound" >
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName"   />
                <asp:BoundField DataField="City" HeaderText="City"           />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
                <asp:BoundField DataField="Description" HeaderText="Description" />

                <asp:TemplateField HeaderText="Gender">
                    <ItemTemplate>
                    <asp:RadioButtonList ID="RGender" runat="server" 
                        RepeatDirection="Horizontal" 
                        Text='<%# Eval("Gender") %>'  >
                        <asp:ListItem>M</asp:ListItem>
                        <asp:ListItem>F</asp:ListItem>                            
                    </asp:RadioButtonList>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Option">
                    <ItemTemplate>
                    <asp:DropDownList ID="cboOption" runat="server" 
                        DataValueField="ID"
                        DataTextField="Feature" >
                    </asp:DropDownList>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>

加载网格的代码是这样的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GHotels.DataSource = MyRst("SELECT * FROM tblHotelsA ORDER BY HotelName");
            GHotels.DataBind();
        }
    }

    public DataTable MyRst(string strSQL)
    {
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                cmdSQL.Connection.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }

现在我们有了这个:

但是,请注意我们仍然需要加载单选按钮列表,并且还要设置组合框以提供一组不同的选择。

因此,我们将这段代码添加到行数据绑定事件中。

    protected void GHotels_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView gData = e.Row.DataItem as DataRowView;

            // based on Gender fill cbo box
            string strSQL = "SELECT ID, Feature FROM tblHotelOptions ";
            if (gData["Gender"].ToString() == "M")
            {
                strSQL += "WHERE Gender = 'M'";
            }
            else
            {
                strSQL += "WHERE Gender = 'F'";
            }
            strSQL += " ORDER BY Feature";
            DropDownList cboOption = e.Row.FindControl("cboOption") as DropDownList;
            cboOption.DataSource = MyRst(strSQL);
            cboOption.DataBind();
            cboOption.Items.Insert(0, new ListItem("Select", "0"));
            if (gData["HotelOption"] != null)
                cboOption.SelectedValue = gData["HotelOption"].ToString();
        }
    }

因此,对于每个网格行,我们处理数据行信息,并有条件地加载带有基于性别的选项的下拉列表。

现在,这适用于“加载”,但现在我们需要添加事件和代码以用于更改单选按钮选项。

因此,在标记中,我们将此事件添加到单选按钮:

我们必须使用标记和 intel-sense 弹出创建新事件的选项,如下所示:

因此,我们在单选按钮列表中添加了 autopostback=true,并选择了更改事件。

所以,现在当您更改单选选项时,我们需要 运行 代码来更改下拉列表选项。

因此,该代码可以如下所示:

    protected void RGender_SelectedIndexChanged(object sender, EventArgs e)
    {
        RadioButtonList rBtn = sender as RadioButtonList;
        GridViewRow gRow = rBtn.NamingContainer as GridViewRow;

        string strSQL = "SELECT ID, Feature FROM tblHotelOptions ";
        if (rBtn.SelectedItem.Text == "M")
            // based on Gender fill cbo box
        {
            strSQL += "WHERE Gender = 'M'";
        }
        else
        {
            strSQL += "WHERE Gender = 'F'";
        }
        strSQL += " ORDER BY Feature";
        DropDownList cboOption = gRow.FindControl("cboOption") as DropDownList;
        cboOption.DataSource = MyRst(strSQL);
        cboOption.DataBind();
        cboOption.Items.Insert(0, new ListItem("Select", "0"));
    }

事实上,代码与我们加载网格的方式非常相似。