簡體   English   中英

這個重新排序列表控件我做錯了什么?

[英]What have I done wrong with this re-order list control?

這讓我如廁,我看不出有什么問題。 控件按預期顯示,但您無法重新排序項目。 每當您嘗試時,您都會收到一條提示“重新訂購失敗,請參閱下面的詳細信息。\r\n\r\n重新訂購失敗。”,這並不是特別有用,而且我在控制台或控制台上看不到任何問題網絡流量。

我檢查了所有表和字段名稱,它們都匹配,包括大小寫。 希望人們看看它並指出我的錯誤(我有一種討厭的感覺是愚蠢的)。

ASP 頁面

    <form id="form1" runat="server">
        <asp:ScriptManager runat="server" ID="ScriptManager1" />

        <div style="width: 90%; margin-left: 2.5%; padding-top: 5px;">
            <ajax:ReorderList ID="rlActiveItems" runat="server" SortOrderField="Ordering" AllowReorder="true"
                DataSourceID="sdsActiveItems" DataKeyField="ID" LayoutType="table" ItemInsertLocation="End" ShowInsertItem="True" Width="100%">
                <DragHandleTemplate>
                    <span class="DragHandleClass">&nbsp;</span>
                </DragHandleTemplate>
                <ReorderTemplate>
                    <div class="DragClass">&nbsp;</div>
                </ReorderTemplate>
                <ItemTemplate>
                    <div class="etched bgBlue itemArea" data-item='<%#Eval("ID")%>' style="float: left; width: 100%; cursor: pointer;">
                        <div class="inner">
                            <div style="float: right; width: 30px; text-align: center;">
                                <asp:Image ID="iDelete" runat="server" ImageUrl="~/images/icon_delete.png" />
                            </div>
                            <div style="float: left; width: calc(100% - 40px); font-weight: bold;">
                                <asp:Label ID="lID" runat="server" Visible="false" Text='<%#Eval("ID")%>'></asp:Label>
                                <asp:Label ID="lOrder" runat="server" Visible="false" Text='<%#Eval("Ordering")%>'></asp:Label>
                                <%#Eval("Name")%>
                            </div>
                        </div>
                    </div>
                </ItemTemplate>
            </ajax:ReorderList>
        </div>

        <asp:SqlDataSource ID="sdsActiveItems" runat="server"
            ConnectionString="<%$ ConnectionStrings:ApplicationConnectionString %>"
            OldValuesParameterFormatString="original_{0}"
            SelectCommand="SELECT ID, Name, Ordering FROM LOGREQItems WHERE Active = 1 AND FkGroup = 3 ORDER BY Ordering"
            UpdateCommand="UPDATE [LOGREQItems] SET Ordering = @Ordering WHERE ID = @original_ID">
            
            <UpdateParameters>
                <asp:Parameter Name="Ordering" Type="Int32" />
                <asp:Parameter Name="original_ID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    </form>

桌子

CREATE TABLE [dbo].[LOGREQItems](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [FkGroup] [int] NOT NULL,
    [Ordering] [int] NOT NULL,
    [Active] [bit] NOT NULL

好吧,主要問題是您在頁面上有數據源。 所以,它有點像一個排序的數據源。 如果您不回發,那么它可能可以工作,但是使用您的數據源以及該數據源中固定的排序順序,那么理論上您將不得不更新表數據。

所以,我建議你轉儲頁面數據源。 我傾向於不經常使用它們。 (事實上​​,我經常將向導用於網格視圖或其他任何東西,讓標記生成,然后從給定控件中刪除數據源和 datasourceID。

所以,讓我們在內存中執行此操作,並且無需回發。 這將允許您查看、嘗試、玩重新排序。

(但是,如果不更新驅動這個的數據源,那么我們可以保存(但是,我將發布第二個示例)。

好的,所以,我們的簡單標記:

<ajaxToolkit:ReorderList ID="ReorderList1" runat="server"
    AllowReorder="True"      
    DataKeyField="ID" 
    SortOrderField="MyOrder" >

    <DragHandleTemplate>
        <span style="cursor:move"><i class="glyphicon glyphicon-move"></i></span>
    </DragHandleTemplate>

    <ReorderTemplate><div></div></ReorderTemplate>

    <ItemTemplate>
        <asp:TextBox ID="txtHotel" runat="server"
            Text='<%# Eval("HotelName") %>'></asp:TextBox>
    </ItemTemplate>
</ajaxToolkit:ReorderList>
<br />

<asp:Button ID="cmdSave" runat="server" Text="Save Changes" CssClass="btn" />

我們要加載的代碼:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadData()
    End If

End Sub

Sub LoadData()

    ReorderList1.DataSource =
        MyRst("SELECT ID, HotelName, MyOrder FROM tblHotelsA ORDER BY MyOrder")
    ReorderList1.DataBind()

End Sub

我們現在得到了這個:

在此處輸入圖像描述

現在,上面對我來說很好。

(不是很多用途,因為我們不更新表格,也不在這里訂購)。

但是,現在讓我們這樣做,PERSIT 我們的數據表,並更新該表。

因此,現在,當我們拖放(移動項目)時,我們還將更新數據表中的 MyOrder 列。 為此,我們現在必須回發,這也意味着我們必須重新綁定重新排序列表控件。

所以,現在我們有了這個標記。 (我可以強調必須設置 MyOrder 列設置 - 對於所有這些示例)。

好的,所以,現在標記是這樣的:

<ajaxToolkit:ReorderList ID="ReorderList1" runat="server"
    AllowReorder="True"      
    DataKeyField="ID" 
    SortOrderField="MyOrder"
    PostBackOnReorder ="true"
    >

(沒有其他變化)。

但是,我們的代碼現在必須維護、持久化和保留數據的副本——我們將使用會話(或者,你可以我想直接向上表數據——但讓我們最后做吧)。

所以,現在我們的代碼是這樣的:

Dim rstData As New DataTable Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 處理 Me.Load

    If Not IsPostBack Then
        LoadData()
        Session("rstData") = rstData
    Else
        rstData = Session("rstData")
    End If

End Sub

Sub LoadData()

    rstData = MyRst("SELECT ID, HotelName, MyOrder FROM tblHotelsA ORDER BY MyOrder")
    ReorderList1.DataSource = rstData
    ReorderList1.DataBind()

End Sub

注意非常小心 - 我們維護該表的副本(在 session() 中)。

因此,請注意我們如何在頁面類級別聲明 rstData - 而不是 page.load 事件,我們第一次加載,推入會話(或對於任何其他回發,我們從 session() 恢復到該頁面類 rstData var .

但是,我們現在還有回發事件,該代碼必須使用拖放結果更新 rstData 表。

我們有這個代碼:

Protected Sub ReorderList1_ItemReorder(sender As Object, e As AjaxControlToolkit.ReorderListItemReorderEventArgs) Handles ReorderList1.ItemReorder

    If e.OldIndex < e.NewIndex Then
        ' move everything up (towards top) in list
        For Each OneRow As DataRow In rstData.Rows
            If OneRow("MyOrder") = e.OldIndex Then
                OneRow("MyOrder") = e.NewIndex
            Else
                If OneRow("MyOrder") >= e.OldIndex And OneRow("MyOrder") <= e.NewIndex Then
                    OneRow("MyOrder") -= 1
                End If
            End If
        Next
    Else
        For Each OneRow As DataRow In rstData.Rows
            If OneRow("MyOrder") = e.OldIndex Then
                OneRow("MyOrder") = e.NewIndex
            Else
                If OneRow("MyOrder") >= e.NewIndex And OneRow("MyOrder") <= e.OldIndex Then
                    OneRow("MyOrder") += 1
                End If
            End If
        Next
    End If
    Session("rstData") = rstData

    Dim Myview As New DataView(rstData)
    Myview.Sort = "MyOrder"
    Call MyDisplay(Myview)
    ReorderList1.DataSource = Myview
    ReorderList1.DataBind()

End Sub

現在,再次,上述工作正常。 因此,當用戶重新訂購商品時,我們會回發並更新該表。 但是,我實際上必須將表格重新保存為已排序。 (它在內存中)。

好的,那么現在,實際保存回數據庫怎么樣?

好吧,我們有那個保存按鈕。

將更改寫回數據庫的代碼如下:

Protected Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click

    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand("SELECT ID, HotelName, MyOrder FROM tblHotelsA", conn)
            Dim da As New SqlDataAdapter(cmdSQL)
            Dim daU As New SqlCommandBuilder(da)
            conn.Open()
            da.Update(rstData)
        End Using
    End Using

End Sub

上面將寫回數據庫對rstData的任何更改(實際上,正如所寫,隨着時間的推移發生的任何插入、刪除或更新到持久表將全部更新回源(sql server)數據庫. 注意非常接近 在上面那個可愛的例程中 - 我們不使用那個 sqlCMD 對象重新提取數據,我們只發送/寫回 rstData 表。事實上,只有實際更新的行才會將更新命令返回給 sql server。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM