2011-08-07 38 views
9

Tôi đang sử dụng ASP.NET để tạo một trang có GridView rất dễ chỉnh sửa cho người dùng cuối. Về cơ bản, tất cả các hàng chứa TextBox (thay vì văn bản tĩnh) mà người dùng có thể chỉnh sửa bất cứ khi nào anh ta muốn. Không có postback xảy ra bao giờ, trừ khi anh ta nhấp vào nút Save ở dưới cùng của trang. Sau đó, tôi lặp qua mỗi hàng trong lưới, lấy các giá trị trong các điều khiển trong mỗi hàng và lưu chúng trở lại cơ sở dữ liệu.Truy xuất các hàng trước và tiếp theo trong một bảng bằng cách sử dụng jQuery

Tôi hiện đang cố gắng thực hiện hoán đổi hai hàng (để di chuyển hàng lên hoặc xuống) trong Javascript và tôi cần một số cách để truy xuất các hàng trước và tiếp theo trong bảng.

Hiện tại GridView của tôi chứa một HiddenField làm cột đầu tiên, chứa Id duy nhất của mục dữ liệu (tôi cần điều này để lưu trữ lại cơ sở dữ liệu). Đối với các mục đích khác (xóa liên tiếp) Tôi đã tìm ra cách để lấy Id này, đó là:

var itemHf = $(this).parent().parent().parent().find(':input'); 

Có rất nhiều 'mẹ' gọi vì điều này xảy ra trong sự kiện click của một hình ảnh, đó là bên trong một LinkButton, nằm bên trong cột cuối cùng của lưới của tôi. Vì vậy, cha mẹ đầu tiên là LinkButton, tiếp theo là ô bảng và cuối cùng là hàng của bảng. Sau đó, tôi cho rằng hàm find(':input') trả về phần tử đầu vào đầu tiên trong hàng này (trong trường hợp của tôi là trường ẩn chứa id).

Vì vậy, sử dụng cùng một phương pháp tôi có thể nhận được hàng hiện:

var row = $(this).parent().parent().parent(); 

Nhưng làm thế nào để tôi nhận được hàng trước và tiếp theo?

Ngoài ra, khi tôi có các hàng đó, tôi sẽ cần truy xuất các giá trị từ nhiều yếu tố đầu vào hơn. Tôi biết tôi có thể tìm số đầu tiên bằng cách sử dụng find(':input'), nhưng làm cách nào để tìm các yếu tố đầu vào thứ hai và thứ ba trong hàng của bảng này?

EDIT
Tôi không có bất kỳ html nào tại thời điểm này nhưng đây là ASP.NET đánh dấu cho lưới điện:

 <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> 

Và đây là một ví dụ về jQuery Tôi đang sử dụng:

$(document).ready(function() { 

     $('table td img.delete').click(function() { 
      var id = $(this).closest('tr').find(':input').val(); 
      alert(id); 
     }); 
    }); 
+0

Nó sẽ rất hữu ích nếu bạn muốn gửi một số tương ứng HTML ... – Tomm

+0

@Tomm tôi đăng các ASP .NET (không có quyền truy cập vào html được hiển thị ngay bây giờ) và cách tôi đang sử dụng jQuery. Hy vọng nó giúp. Bây giờ tôi đã quản lý để có được các hàng tiếp theo và trước đó, nhưng bây giờ tôi cũng cần truy xuất các phần tử đầu vào tiếp theo trên hàng đó. Tôi chỉ tìm thấy cái đầu tiên nhưng có thêm hai thứ nữa (không phải trong cùng một cột của khóa học, như bạn có thể thấy từ asp.net, vì vậy tôi đoán tôi phải tìm kiếm bắt đầu từ 'cha mẹ lên'?) –

Trả lời

23

Bạn có thể truy cập vào hàng bằng cách làm này:

var row = $(this).closest('tr'); 

Bây giờ bạn có hàng, bạn có thể nhận hàng tiếp theo/trước bằng cách thực hiện việc này:

var next = row.next(); 
var prev = row.prev(); 

Để chuyển các hàng xung quanh, bạn có thể sử dụng .detach().appendTo()

+0

Cảm ơn, tôi đã quản lý để truy xuất các hàng tiếp theo và trước đó ngay bây giờ. Tôi cũng có thể di chuyển chúng bằng cách tháo rời và gắn (mặc dù chúng dường như không chuyển đổi xung quanh, một hàng dường như di chuyển lên hai nơi, một hàng dường như di chuyển xuống một vài nơi, nhưng đó có thể là lỗi của tôi). Tuy nhiên, các hàng chỉ di chuyển phía máy khách; khi tôi lặp lại bộ sưu tập hàng của GridView ở phía máy chủ sau đó, nó sẽ trả về chúng theo thứ tự ban đầu, vì vậy nó cũng lưu chúng theo thứ tự ban đầu. –

+0

Nếu tôi có thể trao đổi xung quanh các giá trị thực tế trong các đầu vào (bên cạnh trường Id ẩn có hai hộp văn bản), thì tôi nghĩ chúng sẽ được lưu theo thứ tự mới của chúng. Đối với điều đó, tôi cũng cần phải có thể tìm thấy các đầu vào tiếp theo. Tôi đang sử dụng 'find (': input')' để tìm đầu vào đầu tiên, nhưng làm cách nào để tìm đầu vào tiếp theo? Tôi đã không có may mắn bằng cách sử dụng 'next()' trong trường hợp này, tôi đã thử một số biến thể như 'row.find (': input'). Next()' hoặc 'row.find (': input').).tiếp theo (': input') 'nhưng không may mắn ... –

+0

Nevermind, tôi hiểu rồi! –

1

Theo như tôi hiểu bài viết của bạn var row = $(this).parent().parent().parent(); có thể được thay thế bằng

var row = $(this).parents("tr"); 

Ngoài ra, var itemHf = $(this).parent().parent().parent().find(':input'); có lẽ tốt hơn nên được thể hiện là

var itemHf = $(this).parents('tr').find('input:first'); 

Vì vậy, để có được hàng trước, bạn sẽ sử dụng

var prevHf=$(this).parents('tr').prev().find('input:first'); 

và hàng tiếp theo sẽ là

var nextHf=$(this).parents('tr').next().find('input:first'); 
+0

Cảm ơn . Tôi đoán 'find ('input: first')' rõ ràng chỉ trả về phần tử đầu vào đầu tiên. Làm thế nào để tôi nhận được các yếu tố thứ hai và thứ ba? –

+0

Nevermind, tôi hiểu rồi! Câu trả lời của bạn cũng tốt bằng cách này nhưng tôi chỉ có thể đánh dấu một câu trả lời là được chấp nhận, xin lỗi! –

2

I figured it out. Khi tôi có một hàng (hoặc hàng hiện tại hoặc hàng trước đó), tôi có thể tìm thấy phần tử đầu vào đầu tiên sử dụng cùng định dạng như trước. Sau đó, tôi có thể tìm thấy các tế bào gần nhất ('td'), gọi tiếp theo() trên đó và sau đó tìm thấy những yếu tố đầu vào đầu tiên một lần nữa:

var row = $(this).closest('tr'); 
var idInput = row.find(':input'); 
var nextInput = idInput.closest('td').next('td').find(':input'); 

Có thể có một cách tốt hơn, nhưng hoạt động này vì vậy tôi hạnh phúc với nó ngay bây giờ.

Nhờ sự giúp đỡ của bạn, vì một lý do tôi có thể không bao giờ khá nắm bắt các khái niệm về jQuery ...

Các vấn đề liên quan