1

4列のグリッドビューがあります。列 1 にプレースホルダーを追加し、他の 3 列はバインドされたフィールドです。列 1 では、ラジオ ボタンを 1 つだけ選択できる HTML コードを使用して動的にラジオ ボタンを追加しています。うまく機能していますが、グリッドビューの外側のボタンをクリックすると、ラジオ ボタン コントロールが見つからないという問題があります。

助けてください、私はこの問題で 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

なぜ dynamic を作成する必要があるのか​​ は明確ではありませんRadioButton。これにより、この場合、利点がなければすべてがより困難になります(ネストされたRepeaterorGridViewがより簡単になる場合でも)。

でも、

がデータバインドされたRowDataBound場合にのみトリガーされるため、動的コントロールを作成しないでください。GridViewただし、デフォルトで有効になっているため、ポストバックでViewStateは有効になりません。DataBind一方、動的コントロールはすべてのポストバックで再作成する必要があります。

したがってRowCreated、すべてのポストバックでトリガーされるようにそれらを作成します。ただし、この段階でDataItemあるためnull(グリッドがデータバインドされている場合でも)、(もちろん) 存在しないことに注意してください。

したがって、動的なコントロールを作成する必要がありますが、それらにアクセスできる場所RowCreatedからロードする必要があります (fe via )。RowDataBoundFindControl

ただし、html-control を追加する代わりに、id を<input type='radio'作成して追加する必要があります。そうしないと、サーバー コントロールではないため、RadioButton後でアクセスできなくなります。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 で見つけることはできません。

また、単純な html コントロールであるため、ホルダーの Controls プロパティをループできるかどうかもわかりません。ただし、FindControl 行にブレークポイントを設定して、holder の Controls プロパティを調べることができます。

于 2013-01-25T08:23:03.510 に答える