1

我有 4 列的网格视图;在第 1 列中,我添加了一个占位符,其他 3 列是绑定字段。在第 1 列中,我使用 html 代码动态添加单选按钮,通过该代码我只能选择一个单选按钮。它运行良好,但问题是当单击gridview 之外的按钮时,我无法找到单选按钮控件。

请帮忙,我已经被这个问题困了4天了。

先感谢您。

我使用了以下代码

.aspx 文件

<form id="form1" runat="server">

            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" 
            CellPadding="3" ForeColor="Black" GridLines="Vertical" 
                onrowdatabound="GridView1_RowDataBound" 
                >
            <AlternatingRowStyle BackColor="#CCCCCC" />
        <Columns>
        <asp:TemplateField HeaderText="Select">
        <ItemTemplate>

        <asp:PlaceHolder ID="ph" runat="server"></asp:PlaceHolder>
        </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField  HeaderText="FIRST NAME" DataField="FNAME"/>
        <asp:BoundField  HeaderText="LAST NAME" DataField="LNAME"/>
        <asp:BoundField  HeaderText="EMAIL" DataField="EMAIL"/>
        <asp:BoundField  HeaderText="AGE" DataField="AGE"/>
        </Columns>
            <FooterStyle BackColor="#CCCCCC" />
            <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
            <SortedAscendingCellStyle BackColor="#F1F1F1" />
            <SortedAscendingHeaderStyle BackColor="#808080" />
            <SortedDescendingCellStyle BackColor="#CAC9C9" />
            <SortedDescendingHeaderStyle BackColor="#383838" />
        </asp:GridView>
        <asp:Button  ID="btnSave" Text="Save" runat="server" onclick="btnSave_Click1"  />

    </form>

代码隐藏文件

 protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex != -1 && e.Row.DataItem != null)
        {
            PlaceHolder holder = (PlaceHolder)e.Row.FindControl("ph");
            RadioButton rb = new RadioButton();
            rb.ID = "rbSelect";
            holder.Controls.Add(rb);
        }
    }



 protected void btnSave_Click1(object sender, EventArgs e)
    {
        for (int i = 0; i < GridView1.Rows.Count; i++)
        {

            PlaceHolder holder = (PlaceHolder)GridView1.Rows[i].Cells[0].FindControl("ph");
            RadioButton rbtn = holder.FindControl("rb") as RadioButton;
            if (rbtn.Checked == true)
            {
                Response.Write("<Script>alert('Radiocheck')</Script>");
            }
        }
    }
4

2 回答 2

1

根本不清楚为什么需要创建动态RadioButtons。在这种情况下,如果没有任何好处,这会使一切变得更加困难(即使嵌套RepeaterGridView会更容易)。

然而,

您不应该在其中创建动态控件,RowDataBound因为只有在数据GridView绑定时才会触发该控件。但是由于默认情况下ViewState已启用,因此您不会DataBind在回发时使用它。另一方面,必须在每次回发时重新创建动态控件。

因此,创建它们在RowCreated每次回发时触发。但请注意,您(当然)没有DataItem,因为它null处于此阶段(即使网格将是数据绑定的)。

因此,您应该在其中创建动态控件,RowCreated但从RowDataBound您也可以访问它们的位置加载它们(fe via FindControl)。

但是不要像添加 html-control 那样<input type='radio'创建并添加一个RadioButton带有 id 的控件。否则,您以后将无法访问它,因为它不是服务器控件,所以holder.FindControl("rb")也会如此。null

这是完整的修改代码:

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        PlaceHolder holder = (PlaceHolder)e.Row.FindControl("ph");
        var rb = new RadioButton();
        rb.ID = "RbSample";
        rb.Text = "rb";
        holder.Controls.Add(rb);
    }
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var row = ((DataRowView)e.Row.DataItem).Row;
        var rb = (RadioButton)e.Row.FindControl("RbSample");
        rb.Checked = row.Field<bool>("SampleActive");
    }
}


protected void btnSave_Click1(object sender, EventArgs e)
{
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        RadioButton rbtn = (RadioButton)GridView1.Rows[i].FindControl("RbSample");
        if (rbtn.Checked)
        {
            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alert", "alert('Radiocheck');", true);
        }
    }
}
于 2013-01-25T08:18:16.787 回答
0

看起来您正在使用输入的“值”执行 FindControl,但没有使用控件的 ASP.NET ID,因为它没有。因为它不是 ASP.NET 控件,所以您无法使用 FindControl 找到它。

我也不知道你是否可以遍历 holder 的 Controls 属性,因为它是一个普通的 html 控件。但是您可以尝试在 FindControl 行上放置一个断点并探索 holder 的 Controls 属性。

于 2013-01-25T08:23:03.510 回答