Avatar billede henrik_40 Juniormester
10. juni 2014 - 16:17 Der er 6 kommentarer og
1 løsning

Dataview fra Stored Procedure

Hej jeg har et gridview som jeg binder med linq og stored procedure.

Jeg vil gerne lave sorting på gridviewet:
<asp:GridView OnSorting="GridViewParts_Sorting" AllowSorting="true" runat="server" ID="GridViewParts">
    <HeaderStyle CssClass="DataGridHeader" />
</asp:GridView>

Jeg fylder Gridviewet op således:
var foundparts = db.hah_AllParts(partype, TextBoxSearch.Text);
GridViewParts.DataSource = foundparts.ToList();

For at kunne lave sort på resultatet bliver jeg nødt til at bruge gridview. Hvordan får jeg lavet min stored procedure om til gridview, så jeg kan lave sort?
Avatar billede montago Praktikant
29. juni 2014 - 17:41 #1
Alt efter hvor mange resultater du får, så har GridView jo allerede noget inbygget funktionalitet til at sortere

det eneste du skal, er at indsætte de rette <ASP:xxx> elementer og lave metoder til paging.

der finde en milliard artikler på nettet om emnet.

http://www.dotnetgallery.com/kb/resource12-How-to-implement-paging-and-sorting-in-aspnet-Gridview-control.aspx.aspx
Avatar billede henrik_40 Juniormester
25. juli 2014 - 15:37 #2
montago ->
Det er ikke helt det som jeg søger.

Her bliver der sorteret på datatables:
http://www.codeproject.com/Tips/663532/How-to-Perform-Sorting-in-Gridview-in-ASP-NET


Jeg tænkte på om man kunne sortere på Stored Procedure resultatet?

Altså i stil med:
var foundparts = db.hah_AllParts(partype, TextBoxSearch.Text);
foundparts.SortBy("name").Asc
Avatar billede montago Praktikant
25. juli 2014 - 16:34 #3
hvis det er Linq2SQL eller Linq2Entities kan du sagtens ...

db.SP_SPNAME().OrderBy(o => o.column);
Avatar billede henrik_40 Juniormester
28. juli 2014 - 10:28 #4
montago ->

Tak for det hjalp en hel del :-)

Her er min løsning:


1) funktionen som populater gridviewet første gang:

            var db = new ServicePartnerEntities1();
            var offerSearchResult = db.hah_OfferTemplates(
                (TextBoxTemplates.Text.Length > 2 ? TextBoxTemplates.Text : null)
                , byte.Parse(DropDownVisible.SelectedValue)
                , (selectedPartner == 0 ? null : selectedPartner)
                , (selectedValueVendorID == 0 ? null : selectedValueVendorID)
                , (selectedValueProductlineid == 0 ? null : selectedValueProductlineid)
                , produktfamilieid);

            GridViewTemplates.Visible = true; LabelResult.Visible = true;
            GridViewTemplates.DataSource = offerSearchResult.ToList();
            GridViewTemplates.DataBind();
            LabelResult.Text = "Der blev fundet "+ GridViewTemplates.Rows.Count.ToString() + " tilbudsskabeloner";




2) En Get sort Direction (ved Viewstate), som bare skifter retning:

        private string GetSortDirection(string column)
        {
            // By default, set the sort direction to ascending.
            string sortDirection = "ASC";

            // Retrieve the last column that was sorted.
            string sortExpression = ViewState["SortExpression"] as string;

            if (sortExpression != null)
            {
                // Check if the same column is being sorted.
                // Otherwise, the default value can be returned.
                if (sortExpression == column)
                {
                    string lastDirection = ViewState["SortDirection"] as string;
                    if ((lastDirection != null) && (lastDirection == "ASC"))
                    {
                        sortDirection = "DESC";
                    }
                }
            }

            // Save new values in ViewState.
            ViewState["SortDirection"] = sortDirection;
            ViewState["SortExpression"] = column;

            return sortDirection;
        }



3) og så det bøvlede. Sorteringen (hvor jeg bl.a. laver databasekaldet en gang til):

protected void GridViewTemplates_Sorting(object sender, GridViewSortEventArgs e)
        {
            string searchoffertext = (TextBoxTemplates.Text.Length > 2 ? TextBoxTemplates.Text : "Ingen søgetekst");
            string visibleText = "";
           

            switch (byte.Parse(DropDownVisible.SelectedValue))
            {
                case 0:
                    visibleText = "USYNLIG";
                    break;
                case 1: ;
                    visibleText = "SYNLIG";
                    break;
                default:
                    visibleText = "Både SYNLIG og USYNLIG";
                    break;
            }

            int? selectedPartner = TryToParse(DropDownListPartner.SelectedValue);
            int? selectedValueVendorID = TryToParse(DropDownVendor.SelectedValue);
            int? selectedValueProductlineid = TryToParse(DropDownProductLine.SelectedValue);

            int? produktfamilieid = TryToParse(DropDownFamily.SelectedValue);

            var db = new ServicePartnerEntities1();
            var offerSearchResult = db.hah_OfferTemplates(
                (TextBoxTemplates.Text.Length > 2 ? TextBoxTemplates.Text : null)
                , byte.Parse(DropDownVisible.SelectedValue)
                , (selectedPartner == 0 ? null : selectedPartner)
                , (selectedValueVendorID == 0 ? null : selectedValueVendorID)
                , (selectedValueProductlineid == 0 ? null : selectedValueProductlineid)
                , produktfamilieid);

            if (e.SortExpression.ToString() == "NameSort")
            {
                if (GetSortDirection(e.SortExpression).Contains("ASC"))
                {
                    var  offerSearchSort = offerSearchResult.OrderBy(o => o.Name);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
                else
                {
                    var offerSearchSort = offerSearchResult.OrderByDescending(o => o.Name);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
            }

            if (e.SortExpression.ToString() == "DescriptionSort")
            {
                if (GetSortDirection(e.SortExpression).Contains("ASC"))
                {
                    var offerSearchSort = offerSearchResult.OrderBy(o => o.Description);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
                else
                {
                    var offerSearchSort = offerSearchResult.OrderByDescending(o => o.Description);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
            }

            if (e.SortExpression.ToString() == "PartnerNameSort")
            {
                if (GetSortDirection(e.SortExpression).Contains("ASC"))
                {
                    var offerSearchSort = offerSearchResult.OrderBy(o => o.PartnerName);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
                else
                {
                    var offerSearchSort = offerSearchResult.OrderByDescending(o => o.PartnerName);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
            }

            if (e.SortExpression.ToString() == "VendorNameSort")
            {
                if (GetSortDirection(e.SortExpression).Contains("ASC"))
                {
                    var offerSearchSort = offerSearchResult.OrderBy(o => o.VendorName);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
                else
                {
                    var offerSearchSort = offerSearchResult.OrderByDescending(o => o.VendorName);
                    GridViewTemplates.Visible = true; LabelResult.Visible = true;
                    GridViewTemplates.DataSource = offerSearchSort.ToList();
                    GridViewTemplates.DataBind();
                }
            }

        }




Jeg synes selv min løsning virker lidt bøvlet, så kritik og ændringsforslag er meget velkomne, men du har allerede tjent pointene ;)

(f.eks. tænkte jeg om man kunne gemme resultatet [var offerSearchResult] globalt og herfra lave sortering. Eller om man kunne overføre [var offerSearchResult] via viewstate).


Læg et svar og du vil få point.
Avatar billede montago Praktikant
28. juli 2014 - 10:59 #5
Hvis det resultatsæt du viser indeholder alle data som du har brug for - burde du måske skifte væk fra ASP.NET controls og finde noget bedre - evt. Telerik / KendoUI :

http://www.telerik.com/products/aspnet-ajax.aspx

Disse controls kan sortere ude i Javascript så du bare smider data efter dem - så sørger de for at gøre resten.
Avatar billede montago Praktikant
28. juli 2014 - 11:00 #6
se deres Grid control..
http://www.telerik.com/products/aspnet-ajax/grid.aspx

Jeg mener man kan hente deres OpenSource version gratis.
Avatar billede henrik_40 Juniormester
28. juli 2014 - 11:04 #7
Tak for det. Telerik ser godt ud. Vil jeg dyrke ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester