oJM86o
oJM86o

Reputation: 2118

Radiobutton changed value doesnt update hiddenfield?

I've got a hidden field in an asp.net gridview like so:

 <asp:TemplateField>
      <ItemTemplate>
          <input type="hidden" value="0" id="hdnIsChanged" runat="server" />
      </ItemTemplate>
 </asp:TemplateField>

The hidden field is used so that if another field on my gridview is changed I can update the value of this hidden field with the value 1. That way when I click a "Save" button I can loop through the rows of my gridview and only call my database update routine if and only if the hiddenField.Value = "1".

I set this field in the rowdatabound event of the gridview easily with something like this for a textbox:

    HtmlInputHidden hiddenField = (HtmlInputHidden)e.Row.FindControl("hdnIsChanged"); //get handle on hidden row isDirty
    TextBox notes = (TextBox)e.Row.FindControl("txtNotes"); //get notes

//assign onchange / onclick event handlers when something is changed set hidden field to 1
    notes.Attributes.Add("onchange", "document.getElementById('" + hiddenField.ClientID + "').value=1");

This works fine for textboxes and drop downs but I also have a radiobuttonlist in my grid. When I change for instance 3 rows in my gridview by just selecting the radio button, it always ONLY updates 1. It appears the hidden field doesnt get set correctly. I thought I could set it correctly like this:

RadioButtonList rbl = (RadioButtonList)e.Row.FindControl("rbAnswer"); //get answer

                //assign onchange / onclick event handlers when something is changed set hidden field to 1
                  foreach(ListItem li in rbl.Items)
                    li.Attributes.Add("onclick", "document.getElementById('" + hiddenField.ClientID + "').value=1");

This doesn't appear to work and consider clicks for each radio button. As I said if I update three rows by just clicking the radiobutton in each row and then click my save button it only calls the update routine once. It appears the hidden field does not get the value 1.

Can anyone help?

Edit

Just in case here is my entire grid view control:

<asp:UpdatePanel ID="myPanel" runat="server" UpdateMode="Always" >
                     <ContentTemplate>
                    <asp:GridView ID="gvLineItems" runat="server" AllowSorting="True" 
                        AlternatingRowStyle-BackColor="#e5f1fa" AutoGenerateColumns="False" 
                        BackColor="#E8E8E8" CellPadding="4" DataKeyNames="ID" Font-Size="Small" 
                        GridLines="Horizontal" HeaderStyle-BackColor="#4B6C9E" 
                        HeaderStyle-ForeColor="White" ShowFooter="True" Width="700px" 
                             onrowdatabound="gvLineItems_RowDataBound" 
                             onrowcreated="gvLineItems_RowCreated">
                        <AlternatingRowStyle BackColor="#E5F1FA" />
                        <Columns>
                            <asp:TemplateField>
                                 <ItemTemplate>
                                      <input type="hidden" value="0" id="hdnIsChanged" runat="server" />
                                 </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField>
                                <HeaderTemplate>
                                    <asp:CheckBox ID="HeaderLevelCheckBox" runat="server" 
                                        onclick="toggleSelection(this);" ToolTip="Select / Deselect all rows?" />
                                </HeaderTemplate>
                                <ItemTemplate>
                                    <asp:CheckBox ID="chkSelector" runat="server" onclick="ChangeRowColor(this)" 
                                        ToolTip="Select row?" />
                                </ItemTemplate>
                                <ItemStyle HorizontalAlign="Center" Width="1%" />
                                <HeaderStyle HorizontalAlign="Center" />
                            </asp:TemplateField>

                            <asp:TemplateField Visible="False">
                                <ItemTemplate>
                                    <asp:Label ID="lblID" runat="server" style="display:none" 
                                        Text='<%# DataBinder.Eval(Container, "DataItem.ID") %>' Width=".05px"></asp:Label>
                                </ItemTemplate>
                                <ItemStyle Width="1%" />
                                <ControlStyle Width="0px" />
                                <HeaderStyle Width="0px" />
                            </asp:TemplateField>

                              <asp:TemplateField HeaderText="#">
                                <ItemTemplate>
                                    <asp:Label ID="lblSortOrder" runat="server" 
                                        Text='<%# DataBinder.Eval(Container, "DataItem.SortOrder") %>'></asp:Label>
                                </ItemTemplate>
                                 <FooterStyle HorizontalAlign="Center" />
                                 <HeaderStyle HorizontalAlign="Center" />
                                 <ItemStyle HorizontalAlign="Center" />
                            </asp:TemplateField>

                             <asp:TemplateField HeaderText="Validation">
                                <ItemTemplate>
                                    <asp:Label ID="lblValidationItem" runat="server" ToolTip="Type of validation."
                                        Text='<%# DataBinder.Eval(Container, "DataItem.ValidationItem") %>'></asp:Label>
                                </ItemTemplate>
                                 <FooterStyle HorizontalAlign="Center" />
                                 <HeaderStyle HorizontalAlign="Center" />
                                 <ItemStyle HorizontalAlign="Center" />
                            </asp:TemplateField>

                            <asp:TemplateField HeaderText="Test">
                                <ItemTemplate>
                                    <asp:Label ID="lblTest" runat="server" ToolTip="Type of test."
                                        Text='<%# DataBinder.Eval(Container, "DataItem.Test") %>'></asp:Label>
                                </ItemTemplate>
                                <FooterStyle HorizontalAlign="Center" />
                                <HeaderStyle HorizontalAlign="Center" />
                                <ItemStyle HorizontalAlign="Center" />
                            </asp:TemplateField>

                            <asp:TemplateField HeaderText="Method">
                                <ItemTemplate>
                                    <table>
                                        <tbody>
                                            <tr>
                                                <td> <asp:Label ID="lblMethod" Font-Bold="true" runat="server" ToolTip="Method / Question"
                                        Text='<%# DataBinder.Eval(Container, "DataItem.Method") %>'></asp:Label></td>
                                            </tr>
                                            <tr>
                                            <td>
                                             <asp:Label ID="lblMethodNotes" CssClass="tiny" runat="server" ToolTip="Specifications / Notes"
                                        Text='<%# DataBinder.Eval(Container, "DataItem.MethodNotes") %>'></asp:Label>
                                            </td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </ItemTemplate>
                                <ControlStyle Width="250px" />
                                <FooterStyle HorizontalAlign="Left" />
                                <HeaderStyle HorizontalAlign="Left" Width="250px" />
                                <ItemStyle HorizontalAlign="Left" Width="250px" Wrap="True" />
                            </asp:TemplateField>

                            <asp:TemplateField HeaderText="Answer">
                            <ItemTemplate>
                               <div id="dMainAnswer">
                                <asp:RadioButtonList ToolTip="Please provide an answer to the method." AutoPostBack="true" RepeatDirection="Horizontal" ID="rbAnswer" runat="server" SelectedValue='<%# DataBinder.Eval(Container, "DataItem.AnswerID")%>' OnSelectedIndexChanged="rbAnswer_SelectedIndexChanged">
                                    <asp:ListItem Text="Yes" Value="Yes" style="color:green;"></asp:ListItem>
                                    <asp:ListItem Text="No" Value="No" style="color:red;"></asp:ListItem>
                                    <asp:ListItem Text="N/A" Value="N/A"></asp:ListItem>
                                    <asp:ListItem Value="" Text="" style="display: none" />
                                </asp:RadioButtonList>
                                   <asp:Panel ID="pnlAnswer" runat="server" Visible="false">
                                       <div id="dMainAnswerResponsibleType">
                                            <asp:RadioButtonList ID="rbRespType" ToolTip="Select responsible contact type." runat="server" RepeatDirection="Horizontal" AutoPostBack="true" SelectedValue='<%# DataBinder.Eval(Container, "DataItem.ResponsiblePartyType")%>' OnSelectedIndexChanged="rbRespType_SelectedIndexChanged">
                                                <asp:ListItem Selected="True" Text="SE" Value="SE">SE</asp:ListItem>
                                                <asp:ListItem Text="Other" Value="Other">Other</asp:ListItem>
                                                <asp:ListItem Value="" Text="" style="display: none" />
                                            </asp:RadioButtonList>
                                        </div>
                                        <div id="dMainAnswerResponsible">
                                             <asp:DropDownList ID="ddlEmployees" runat="server" 
                                                DataSource="<%# GetEmployees() %>" SelectedValue='<%# Eval("SEContact") %>' DataTextField="FullName" Width="75px"
                                                DataValueField="FullName" 
                                                ToolTip="Select the SE responsible party.">
                                            </asp:DropDownList>
                                            <asp:TextBox ID="txtContact" Text='<%# Eval("ResponsiblePartyContact") %>' Width="75px" MaxLength="50" runat="server" ToolTip="Enter the responsible contact name." Visible="false"></asp:TextBox>
                                        </div>
                                   </asp:Panel>
                               </div>
                            </ItemTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Notes">
                            <ItemTemplate>
                               <asp:TextBox MaxLength="5000" runat="server" ToolTip="Enter any additional notes." ID="txtNotes" TextMode="MultiLine" Text='<%# DataBinder.Eval(Container, "DataItem.Notes") %>'></asp:TextBox>
                            </ItemTemplate>
                                <ControlStyle Font-Names="Arial" />
                                <FooterStyle HorizontalAlign="Left" />
                                <HeaderStyle HorizontalAlign="Left" />
                                <ItemStyle HorizontalAlign="Left" />
                            </asp:TemplateField>
                        </Columns>
                        <HeaderStyle BackColor="#4B6C9E" ForeColor="White" />
                    </asp:GridView>

                  <div style="width:100%;text-align:center;">
                    <asp:Label ID="lblLineItemMessage" runat="server"></asp:Label>
                    <asp:UpdateProgress AssociatedUpdatePanelID="myPanel" DisplayAfter="1" ID="udProgress" runat="server" Visible="True" DynamicLayout="True">
                        <ProgressTemplate>
                            <img style="border-style:none;" src="images/ajax-loader.gif" alt="loading" />
                        </ProgressTemplate>
                    </asp:UpdateProgress>
                </div>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="ddlTypes" />
                    <asp:AsyncPostBackTrigger ControlID="ddlValidations" />
                    <asp:AsyncPostBackTrigger ControlID="ddlTests" />
                    <asp:AsyncPostBackTrigger ControlID="ddlJobs" />
                    <asp:AsyncPostBackTrigger ControlID="rbMethod" />
                    <asp:AsyncPostBackTrigger ControlID="TreeView1" />
                </Triggers>
                </asp:UpdatePanel>

I even tried some jquery to get an alert:

  $(function () {
            $("#<%=gvLineItems.ClientID %> input[type=radio]").click(function () {
                alert("hi");
            });
        });

But I dont think that is right because when I click a radio button I am not seeing any alert. I also need to update the field hdnIsChanged the hiddenfield with the value 1 when a radio button item from the radiobuttonlist rbAnswer is clicked. I am ok to do this in jquery but could use some help. The hiddenfield hdnIsChanged and the radiobuttonlist rbAnswer are both inside an asp.net gridview.

Upvotes: 3

Views: 2443

Answers (2)

oJM86o
oJM86o

Reputation: 2118

I finally got it thanks to debugging through googles developers tool within the browser. I noticed initially on my page (right click inspect element) every radio button within the radiobuttonlist for each row had an "onclick" attribute..Great so far.

The minute I clicked on a radiobutton, I have "AutoPostBack=true" for my radiobuttonlist, the minute I clicked on it, the only item that had the onclick attribute was for the row I clicked. Every other row the attribute was gone.

The simple solution was in the selectedindexchanged event of the radiobuttonlist to loop through each row in the gridview and readd the attribute.

 foreach (GridViewRow row in gvLineItems.Rows)
            {
               HtmlInputHidden hiddenField = (HtmlInputHidden)row.FindControl("hdnIsChanged");
               RadioButtonList rbl2 = (RadioButtonList)row.FindControl("rbAnswer");

              foreach (ListItem li in rbl2.Items)
               {
                   li.Attributes.Add("onclick", "document.getElementById('" + hiddenField.ClientID + "').value=1");
               }
            }

Upvotes: 1

George Aletras
George Aletras

Reputation: 106

Have you considered using jQuery?

<asp:GridView ID="grdViewLines" runat="server" CssClass="dirty-tracking-grid">
<Columns>
    <asp:TemplateField>
        <ItemTemplate>
            <input type="hidden" value="0" runat="server" row-id='<%# DataBinder.Eval(Container, "DataItem") %>'  />
        </ItemTemplate>
        <ItemTemplate>
            <asp:RadioButtonList runat="server" row-id='<%# DataBinder.Eval(Container, "DataItem") %>' CssClass="dirty-tracking">
                <asp:ListItem runat="server" Text="Item1"></asp:ListItem>
                <asp:ListItem runat="server" Text="Item2"></asp:ListItem>
            </asp:RadioButtonList>                    
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField></asp:TemplateField>
</Columns>

<script type="text/javascript">
$(function () {
    $(".dirty-tracking :radio").click(function () {
        var rowId = $(this).closest("table").attr("row-id");
        $(".dirty-tracking-grid input[type=hidden,row-id=" + rowId).val(1);
    });
});

Upvotes: 0

Related Questions