简体   繁体   中英

Can't get value from radio button on gridview on C#

Hello i have a Gridview with 4 radio buttons and i want to get the value from them, and no matter what i do the value is always false, could someone tellme where is my mistake?

This is the code of the gridview:

 <asp:GridView ID="GridView8" runat="server" Width="903px" 
         Height="516px" CellPadding="4" ForeColor="#333333" GridLines="None" 
         Visible="False"  
         >
                     <AlternatingRowStyle BorderColor="Black" BackColor="White" />

     <Columns>
                         <asp:TemplateField HeaderText="Solicitante/">
                             <ItemTemplate>
                                 <asp:RadioButton ID="optCl1" runat="server" Text="SI" GroupName="optCl" />
                                <asp:RadioButton ID="optCl2" runat="server" Text="NO" GroupName="optCl" />
                             </ItemTemplate>
                         </asp:TemplateField>
                         <asp:TemplateField HeaderText="CoGarante">
                             <ItemTemplate >
                             <asp:RadioButton ID="optGar1" runat="server" Text="SI" GroupName="optGar" />
                                <asp:RadioButton ID="optGar2" runat="server" Text="NO" GroupName="optGar" />

                             </ItemTemplate>
                         </asp:TemplateField>
                     </Columns>

                     <EditRowStyle BorderColor="Black" />
                     <FooterStyle BackColor="#990000" BorderColor="Black" ForeColor="White" 
                         Font-Bold="True" />
                     <HeaderStyle BackColor="#990000" BorderColor="Black" Font-Bold="True" 
                         ForeColor="White" />
                     <PagerStyle ForeColor="#333333" HorizontalAlign="Center" BackColor="#FFCC66" />
                     <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
                     <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
                     <SortedAscendingCellStyle BackColor="#FDF5AC" />
                     <SortedAscendingHeaderStyle BackColor="#4D0000" />
                     <SortedDescendingCellStyle BackColor="#FCF6C0" />
                     <SortedDescendingHeaderStyle BackColor="#820000" />

     </asp:GridView>

The code of the function that read the radiobutton

 protected void saveQuestions()
{       
    foreach (GridViewRow row in GridView8.Rows)
    {
        RadioButton rb = row.Cells[2].FindControl("optGar2") as RadioButton;
        Response.Write(rb.Checked);
    }

    conn.Close();
}

The code of the function that set the data on the gridview:

protected void loadQuestions()
{
    OdbcConnection conn = connection();
    conn.Open();

    OdbcCommand findSql = new OdbcCommand("SELECT question AS PREGUNTAS,id FROM questionary_reg WHERE(status='1')", conn);
    GridView8.DataSource = null;

    DataTable dt = new DataTable();
    dt.Load(findSql.ExecuteReader());

    GridView8.DataSource = dt;
    GridView8.DataBind();


    conn.Close();

}

The problem because happen postback and reset the values inside the gridview, make sure you call this function loadQuestions() on if !Postback ONLY

if(!IsPostBack){
  loadQuestions();
}

#UPDATE 1 WORKING CODE :
//Design

<asp:GridView runat="server" ID="gv">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:RadioButton runat="server" ID="rd" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:Button runat="server" ID="btn" onclick="btn_Click" />

//Code

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnStringDb1"].ToString()))
        {
            try
            {
                String cmdText = "SELECT * FROM Image WHERE IsDeleted=@isDeleted";
                SqlCommand cmd = new SqlCommand(cmdText, cn);
                cmd.Parameters.AddWithValue("@IsDeleted", "false");
                cn.Open();
                SqlDataAdapter myAdapter = new SqlDataAdapter(cmd);
                DataTable dt_Category = new DataTable();
                myAdapter.Fill(dt_Category);
                cn.Close();

                gv.DataSource = dt_Category;
                gv.DataBind();
            }
            catch (Exception ex)
            {
            }
        }
    }
}
protected void btn_Click(object sender, EventArgs e)
{
    foreach (GridViewRow gvr in gv.Rows)
    {
        RadioButton rd = (RadioButton)gvr.FindControl("rd");
        if (rd.Checked)
        {
        }
        else
        {
        }
    }
}

Maybe you need a 'CheckedChanged' event: (Tested and working)

In ASPX set (in this example, you can to see label display the number of row selected)

                    <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:RadioButton ID="rbtnSelect" AutoPostBack="true" runat="server" OnCheckedChanged="rbtnSelect_CheckedChanged" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>

and code-behing set

        protected void rbtnSelect_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton selectButton = (RadioButton)sender;
        GridViewRow row = (GridViewRow)selectButton.Parent.Parent;
        int a = row.RowIndex;
        foreach (GridViewRow rw in gvCursos.Rows)
        {
            if (selectButton.Checked)
            {

                if (rw.RowIndex != a)
                {
                    lbResultado.Text = rw.RowIndex.ToString();
                    RadioButton rd = rw.FindControl("rbtnSelect") as RadioButton;
                    rd.Checked = false;
                }
            }
        }
    }

Change this:

RadioButton rb = row.Cells[2].FindControl("optGar2") as RadioButton;

To this:

RadioButton rb = row.FindControl("optGar2") as RadioButton;
for (int i = 0; i < GridView8.Rows.Count; i++)
        {
            if (GridView8.Rows[i].RowType == DataControlRowType.DataRow)
            {
                RadioButton rb= (RadioButton)grdView.Rows[i].FindControl("optGar2");  
                Response.Write(rb.Checked);                   
            }
        }
foreach (GridViewRow gvp in gridView1.Rows)
    {
        System.Web.UI.HtmlControls.HtmlInputRadioButton rd = (System.Web.UI.HtmlControls.HtmlInputRadioButton)gvp.FindControl("rd");
        if (rd.Checked)
        {
            string s = rd.Value;
        }
        else
        {
        }
    }

design view

<ItemTemplate> <input runat="server" id='rd' type="radio" value='<%# Eval("id") %>' onclick="javascript:SelectSingleRadiobutton(this.id)" /> </ItemTemplate>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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