我在asp.net gridview中有一个隐藏字段,如下所示:
<asp:TemplateField>
<ItemTemplate>
<input type="hidden" value="0" id="hdnIsChanged" runat="server" />
</ItemTemplate>
</asp:TemplateField>
使用隐藏字段,以便如果我的gridview上的另一个字段被更改,我可以使用值1更新此隐藏字段的值。这样,当我单击“保存”按钮时,我可以循环遍历我的行gridview,当且仅当hiddenField.Value =“1”时才调用我的数据库更新例程。
我在gridview的rowdatabound
事件中轻松设置此字段,对于文本框,这样的内容:
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");
这适用于文本框和下拉菜单,但我的网格中也有一个radiobuttonlist。当我通过选择单选按钮更改我的gridview中的3行时,它总是只更新1.看起来隐藏的字段没有正确设置。我以为我可以像这样正确设置:
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");
这似乎不起作用,并考虑每个单选按钮的点击次数。正如我所说,如果我通过单击每行中的单选按钮来更新三行,然后单击我的保存按钮,它只调用一次更新例程。隐藏字段似乎没有得到值1.
有人可以帮忙吗?
以防这是我的整个网格视图控件:
<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>
我甚至尝试了一些jquery来获取警报:
$(function () {
$("#<%=gvLineItems.ClientID %> input[type=radio]").click(function () {
alert("hi");
});
});
但我不认为这是正确的,因为当我点击一个单选按钮时,我没有看到任何警报。当点击radiobuttonlist hdnIsChanged
中的单选按钮项时,我还需要使用值1更新字段rbAnswer
。我可以在jquery中这样做,但可以使用一些帮助。隐藏字段hdnIsChanged和radiobuttonlist rbAnswer都在asp.net gridview中。
答案 0 :(得分:1)
我终于得到了它,感谢在浏览器中通过googles开发人员工具进行调试。 我最初注意到我的页面(右键单击inspect元素)每个单选按钮内的每个单选按钮都有一个“onclick”属性。到目前为止很棒。
当我点击radiobutton时,我的radiobuttonlist上有“AutoPostBack = true”,我点击它的那一刻,唯一具有onclick属性的项目是我点击的行。属性消失的每隔一行。
简单的解决方案是在radiobuttonlist的selectedindexchanged
事件中循环遍历gridview中的每一行并读取属性。
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");
}
}
答案 1 :(得分:0)
你考虑过使用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);
});
});