كيفية فرز الأعمدة في ASP.NET GridView في حالة استخدام مصدر بيانات مخصص؟

StackOverflow https://stackoverflow.com/questions/138412

سؤال

لا يمكنني الحصول على GridView الخاص بي لتمكين المستخدم من فرز عمود من البيانات عندما أستخدم SqlDataSource مخصصًا.

لدي GridView حيث يكون الكود الموجود في مرجع ASP إليه في HTML ضئيلًا:

<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>

في الكود الخلفي، أرفق SqlDataSource الذي تم إنشاؤه ديناميكيًا (الأعمدة التي يحتوي عليها ليست دائمًا هي نفسها لذا فإن SQL المستخدم لإنشائه يتم إنشاؤه في وقت التشغيل).على سبيل المثال:

لقد قمت بإعداد الأعمدة ...

BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;

grid.Columns.Add(column);

مصدر البيانات...

SqlDataSource dataSource = new SqlDataSource(
    "System.Data.SqlClient",
    connectionString, 
    generatedSelectCommand);

ثم عرض الشبكة ...

grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();

في الوقت الحالي، لا يحدث شيء عندما ينقر المستخدم على عنوان العمود عندما أتوقع منه فرز بيانات العمود.أي شخص أي أفكار ما أنا في عداد المفقودين؟

إذا كانت هناك طريقة أفضل للقيام بذلك فسيكون ذلك مفيدًا أيضًا لأن هذا يبدو فوضويًا بالنسبة لي!

هل كانت مفيدة؟

المحلول

تحتاج أولاً إلى إضافة حدث:

<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...

ثم يبدو هذا الحدث كما يلي:

protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
    ...
    //rebind gridview
}

عليك في الأساس الحصول على بياناتك مرة أخرى.

أنت على حق في أن الأمر يبدو فوضويًا وهناك طريقة أفضل:ASP.Net MVC

لسوء الحظ، هذا نموذج صفحة مختلف تمامًا.

نصائح أخرى

يمكنك أيضًا إعادة تعيين datasource.SelectCommand قبل استدعاء DataBind() في معالج الفرز.شيء من هذا القبيل:

protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView gv = (GridView)sender;
    SqlDataSource ds = (SqlDataSource)gv.DataSource;
    ds.SelectCommand = ds.SelectCommand + " order by " 
        + e.SortExpression + " " + GetSortDirection(e.SortDirection);
    gvItems.DataSource = ds;
    gvItems.DataBind();
}

string GetSortDirection(string sSortDirCmd)
{
    string sSortDir;
    if ((SortDirection.Ascending == sSortDirCmd))
    {
        sSortDir = "asc";
    }
    else
    {
        sSortDir = "desc";
    }
    return sSortDir;
}

آمل أن تكون هذه المساعدة.اسمحوا لي أن أعرف إذا كنت بحاجة إلى مساعدة إضافية لتنفيذه.

يتمتع!

لست متأكدًا من هذا، ولكن إذا كنت تستخدم SqlDataSource قياسيًا وقمت بالنقر فوق حقل للفرز وفقًا لهذا الحقل، فسيتم ملء SqlDataSource مرة أخرى بالبيانات ويتم ارتداده إلى الشبكة.لذلك لا يتم الفرز من جانب العميل ويمكن أيضًا إجراؤه فقط عندما لا تكون طريقة تحديد SQLDataSource هي DataReader.

عند التعامل مع حدث الفرز، هل تقوم بإعادة إنشاء SqlDataSource وإعادته إلى GridView؟هل يمكنك وضع حقل الفرز والاتجاه في الأمر الذي تم إنشاؤه بواسطة SelectCommand، والذي تستخدمه؟أو وضعها في خاصية SortParameterName الخاصة بـ SQLDataSource؟

أنا متأكد تمامًا من أنه يتعين عليك إعادة SqlDataSource إلى الشبكة، وبما أنك قمت بإنشائه سريعًا، فيجب عليك ملؤه مرة أخرى.

أن تأتي متأخرا أفضل من ألا تأتي أبدا؟

بعض الإضافات لاقتراح كيث وهو في الأساس الاقتراح الصحيح.

الحقيقة هي أنه يتعين عليك التعامل مع الفرز في حدث GridView_Sorting.ليست هناك حاجة إلى DataBind() وGridView سابقًا، على سبيل المثال في حدث Page_Load.هناك يجب عليك فقط استدعاء الأسلوب GridView.Sort() بدلاً من .DataBind().هنا هو كيف ستسير الامور:

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

    If Not IsPostBack Then

        Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))

    End If

End Sub

بعد ذلك، دعونا نلقي نظرة على حدث GridView_Sorting.

هناك عليك دفع مصدر البيانات إلى الفرز الصحيح.GridView نفسه لا يتعامل مع ذلك (في هذه الحالة على الأقل).

Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
    If IsPostBack Then
        e.Cancel = True
        Dim sortDir As SortDirection = SortDirection.Ascending
        If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
            sortDir = SortDirection.Descending
        End If
        RedirectMe(e.SortExpression, sortDir)
    Else
        Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
        Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
        Me.gridView.DataSource = dv
        Me.gridView.DataBind()
    End If
End Sub

لا حاجة إلى ترميز أي وظيفة فرز في مصدر البيانات مثل تمرير معلمات الفرز إلى الإجراء المخزن.تتم جميع عمليات الفرز في أجزاء التعليمات البرمجية المذكورة أعلاه.

علاوة على ذلك، من الجيد أن يتم تبديلgridView.EnableViewState إلى False مما يجعل الصفحة أخف بكثير بالنسبة لحركة مرور الشبكة وللمتصفح أيضًا.يمكن القيام بذلك حيث يتم إعادة إنشاء الشبكة بالكامل عند إعادة نشر الصفحة.

طاب يومك!

مارتن

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top