我正在使用ASP.NET创建一个可以为最终用户编辑的GridView页面。基本上,所有行都包含TextBoxes(而不是静态文本),用户可以随时编辑它们。除非他单击页面底部的“保存”按钮,否则不会发生回发。然后,我遍历网格中的每一行,检索每行控件中的值并将它们保存回数据库。
我现在正尝试在Javascript中实现交换两行(向上或向下移动一行),为此我需要一些方法来检索表中的上一行和下一行。
目前我的GridView包含一个HiddenField作为第一列,其中包含数据项的唯一ID(我需要将其存储回数据库当然)。出于其他目的(删除一行),我已经找到了如何检索此ID,即:
var itemHf = $(this).parent().parent().parent().find(':input');
有很多'父级'调用,因为这发生在Image的click事件中,该事件位于LinkButton内部,它位于网格的最后一列内。所以第一个父亲是LinkButton,下一个是表格单元格,最后是表格行。然后,我想find(':input')
函数返回此行中的第一个输入元素(在我的例子中是包含id的隐藏字段)。
因此,使用相同的方法,我可以获得当前行:
var row = $(this).parent().parent().parent();
但是如何获得上一行和下一行?
此外,一旦我有了这些行,我将需要从更多输入元素中检索值。我知道我可以使用find(':input')
找到第一个,但是如何找到此表行中的第二个和第三个输入元素?
EDIT
我目前没有任何HTML,但这里是网格的ASP.NET标记:
<asp:GridView runat="server" ID="grid" AutoGenerateColumns="False"
onrowcommand="grid_RowCommand" onrowdeleting="grid_RowDeleting">
<Columns>
<!-- Move Up button -->
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" OnClientClick="return false;">
<asp:Image ImageUrl="~/Images/moveUp.png" AlternateText="moveUp" runat="server" CssClass="moveUp" ID="moveUp" />
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<!-- Move Down button -->
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" OnClientClick="return false;">
<asp:Image ImageUrl="~/Images/moveDown.png" AlternateText="moveDown" runat="server" CssClass="moveDown" ID="moveDown" />
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<!-- ID Hidden Field -->
<asp:TemplateField>
<ItemTemplate>
<asp:HiddenField runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "Id") %>' />
</ItemTemplate>
</asp:TemplateField>
<!-- Name textbox field -->
<asp:TemplateField HeaderText="Naam">
<ItemTemplate>
<asp:TextBox runat="server" Width="200px" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
</ItemTemplate>
</asp:TemplateField>
<!-- Price textbox field -->
<asp:TemplateField HeaderText="Prijs">
<ItemTemplate>
<asp:TextBox runat="server" Width="50px" Text='<%# DataBinder.Eval(Container.DataItem, "Price") %>' />
</ItemTemplate>
</asp:TemplateField>
<!-- Delete button -->
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" OnClientClick="return false;">
<asp:Image ImageUrl="~/Images/delete.png" AlternateText="delete" runat="server" CssClass="delete" ID="delete" />
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这是我正在使用的jQuery的一个例子:
$(document).ready(function () {
$('table td img.delete').click(function () {
var id = $(this).closest('tr').find(':input').val();
alert(id);
});
});
答案 0 :(得分:27)
您可以通过执行以下操作来访问该行:
var row = $(this).closest('tr');
现在你有了这行,你可以通过这样做获得下一行/前一行:
var next = row.next();
var prev = row.prev();
要切换行,您可以使用.detach()
和.appendTo()
答案 1 :(得分:2)
我明白了。一旦我得到一行(当前行或前一行),我可以使用与以前相同的格式找到第一个输入元素。然后我可以找到最近的单元格('td'),在其上调用next()然后再次找到第一个输入元素:
var row = $(this).closest('tr');
var idInput = row.find(':input');
var nextInput = idInput.closest('td').next('td').find(':input');
可能有更好的方法,但是这样可行,所以我现在很高兴。
感谢您的帮助,出于某种原因,我永远无法理解jQuery的概念......
答案 2 :(得分:1)
据我所知,您的帖子var row = $(this).parent().parent().parent();
可以替换为
var row = $(this).parents("tr");
此外var itemHf = $(this).parent().parent().parent().find(':input');
可能更好地表示为
var itemHf = $(this).parents('tr').find('input:first');
因此,要获得前一行,您将使用
var prevHf=$(this).parents('tr').prev().find('input:first');
,下一行是
var nextHf=$(this).parents('tr').next().find('input:first');