GridView中的标签更改,但更改不回发
我有一个带有标签的gridview,以及一些使标签可编辑的JavaScript和jQuery。GridView中的标签更改,但更改不回发
但是,当我在我的代码中回发和调试后,我没有看到更改。
我该如何做到这一点,以便我可以在服务器上进行更改?
<asp:GridView ID="gvGroups" runat="server" AutoGenerateColumns="False"
CssClass="table table-hover table-striped" GridLines="None" >
<Columns>
<asp:TemplateField HeaderText="Name" SortExpression="GroupDescription">
<ItemTemplate>
<asp:Label ID="lblName" CssClass="edit" runat="server" Text='<%# Eval("GroupDescription") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
function makeLabelsEditable() {
$(".edit").focusout(function() {
setLabel(this);
});
$(".edit").click(function() {
editLabel(this);
});
}
function editLabel(source) {
source.innerHTML = '<input type="text" maxlength="40" value="' + source.innerHTML + '"/>';
$(source).unbind('click');
source.children[0].focus()
}
function setLabel(source) {
if (source.children[0].value != '') {
$(source).click(function() {
editLabel(this);
});
source.innerHTML = source.children[0].value;
}
}
Label
不会回发到服务器。他们的目的是只读和呈现为一个跨度。如果你想要回发最容易的事情就是使用相同的值来控制Hidden
,并且当你编写代码以允许编辑标签时,确保将编辑后的值写入Hidden
。 Hidden
将被回发到服务器,然后您可以读取该值。
您正在交换'动态'TextBox
,因此服务器不知道您所做的输入控制。你可以阅读原始的发布参数来获取值,但是有一个可以写入的静态控件并知道它将具有你需要的值会更容易。
您无法以这种方式在服务器上进行更改。您只需更改客户端上的html
由于客户端仅用于读取,因此不会为客户端的标签生成ViewState
。因此,您在之前在服务器中设置的回发中获得相同的值。
什么,我能想到的最简单的解决方法是:
- 将一个文本框,而不是标签。
- 对它应用一个css类,使它看起来像一个标签。
- 点击TextBox,删除css。
只要您想给标签外观,就可以将css应用回来。
我认为你的理解是不正确的,或者至少我们可能会想到同样的事情,但不同。 'Label'不会产生'ViewState',尝试在ViewState中应用颜色或服务器端代码,您将看到它将在PostBack之间保留。我们讨论的区别在于呈现的控件(输出)是一个范围,不会回发任何东西。它与典型的span不同,所以ASP.NET对此一无所知。通常我使用'Literal'控件而不是'Label'来避免'ViewState'开销。 – Kelsey
有道理。感谢您的澄清。 – NaveenBhat
我该如何动态地做到这一点?目前我基于标签是否具有编辑类来做。 – user2043533
@ user2043533为每行添加一个“隐藏”控件到您的模板。当您写入文本框(留下焦点或其他东西)时,只需确保将该值复制到“隐藏”中即可。这有点复杂,但你所做的事似乎并不是标准。不知道你为什么不在你的'GridView'中使用'EditTemplate'。 – Kelsey
使用EditTemplate当我点击标签然后在文本框失去焦点时退出时,如何从编辑模式切换到非编辑模式:? – user2043533