Avatar billede anders_cp Nybegynder
15. maj 2009 - 11:33 Der er 8 kommentarer og
1 løsning

Dataview sortering virker ikke

Hej
Jeg vil gerne sortere data i datview desc. Jeg kan ikke få det til at virke. Håber flere øjne kan se hvad jeg gør galt:

            // GET history
            Logic.AbcOrders orders = new Partner.Logic.AbcOrders();
            DataSet dataset = orders.GetABCRevisedActivities_History(actid);
            orders = null;
            DataView historyDataView = dataset.Tables[0].DefaultView;
            historyDataView.Sort = "TIMESTAMP";

ovenstående sorterer forkert, så jeg har prøvet i sidste linje at skrive (uden held):
historyDataView.Sort = "TIMESTAMP DESC";

Kan nogen sige mig hvad der skal gøres, hvis jeg vil sortere i dataviewet og ikke i sql-query'en?
Avatar billede Cars10 Praktikant
15. maj 2009 - 12:05 #1
Der skal står: historyDataView.Sort = "TIMESTAMP DESC";

er du sikker på du bruger historyDataView som source og ikke dataset.Tables[0] eller noget?

ellers mener jeg du kan bruge:

GridView.Columns[0].SortExpression = "";
Avatar billede anders_cp Nybegynder
15. maj 2009 - 12:16 #2
Hejsa
historyDataView.Sort = "TIMESTAMP DESC";
Det har jeg prøvet uden held...

Jeg er ikke helt med på hvad du mener med:

"
er du sikker på du bruger historyDataView som source og ikke dataset.Tables[0] eller noget?
"

Jeg henter data fra db og indsætter i dataviewet:
DataView historyDataView = dataset.Tables[0].DefaultView;

"
GridView.Columns[0].SortExpression = "";
"
Det er IKKE et GridView - blot en tekst i et tekstfelt:
            LabelLatestSPReason.Text = dataview[dataview.Find(actid)]["TIMESTAMP"].ToString();
            LabelLatestSPReason.Text = LabelLatestSPReason.Text + "<br />" + dataview[dataview.Find(actid)]["SP_Reason"].ToString();
            LabelSerialNo.Text = dataview[dataview.Find(actid)]["SerialNumber"].ToString();
            LabelWorkFlow.Text = dataview[dataview.Find(actid)]["WorkFlowDescription"].ToString();
Avatar billede Cars10 Praktikant
15. maj 2009 - 13:57 #3
er det asp.net eller C# windows forms du har gang i?

Jeg kan slet ikke se du bruger historyDataView i dine tekstfelter og hvor for du actid fra. Du bliver nødt til at poste noget lidt mere sammenhængende kode.
Avatar billede sirius Nybegynder
15. maj 2009 - 14:24 #4
øhm det ligner at du vil sortere et dataview og så bagefter bruger du alligevel kun 1 række.

Hvorfor sortere? det er jo din dataview.Find(actid) der afgør hvilken række der bliver vist.
Avatar billede anders_cp Nybegynder
18. maj 2009 - 19:59 #5
cars10 ->
Jeg beklager jeg ikke har udtrykt mig klart nok...
Der er C# asp .net jeg har gang i ;)
Jeg vil prøve at komme med noget bedre forklaring og sammenhængende kode.
Min mening ville være at undgå for mange forespørgsler til databasen, derfor ville jeg læse udtrækket ind i et dataview og udfra dataviewet behandle data.

Det tekstfelt (og ikke datagridview, som jeg er bevidst om man normalt putter lister ind i) er en <asp:TextBox TextMode="MultiLine"></asp:TextBox>

Her er så hele funktionen. "actid" er aktivitetsid for den enkelte sag. 

Det er historyDataView.Sort = "TIMESTAMP", som jeg har udkommenteret og som jeg gerne ville have til at virke. Grunden til jeg ikke bare laver en "order by" i sql'en er at jeg har lært at det er bedst at bruge ressourcerne på klienten og ikke på sql-serveren. Det er derfor ikke strengt nødvendigt, men jeg vil gerne gøre koden så rigtig og effektiv som muligt ;)

        private void FillWCMForm(int actid)
        {
            // Initialisation
            string reasonOwner = ""; string reason = "";
            LabelErrorMessage.Text = "";
            RadioButtonAccept.Checked = false; RadioButtonNonAccept.Checked = false; RadioButtonNote.Checked = false;

            TextBoxHistoryReason.Text = ""; TextboxSPReason.Text = "";
            // GET history
            Logic.FscOrders orders = new ServicePartner.Logic.FscOrders();
            DataSet dataset = orders.GetFSCRevisedActivities_History(actid);
            orders = null;
            DataView historyDataView = dataset.Tables[0].DefaultView;
            //historyDataView.Sort = "TIMESTAMP";

            LabelthisActivity.Text = GetStatusText(actid);

            LabelLatestFscReason.Text = dataview[dataview.Find(actid)]["TIMESTAMP"].ToString();
            LabelLatestFscReason.Text = LabelLatestFscReason.Text + "<br />" + dataview[dataview.Find(actid)]["FSC_Reason"].ToString();


            for (int i = 0; i < historyDataView.Count; i++)
            {
                reasonOwner = historyDataView.Table.Rows[i][4].ToString();

                switch (reasonOwner.ToLower())
                {
                    case "fujitsu":
                        reason = historyDataView.Table.Rows[i][0].ToString();
                        break;
                    default:
                        reason = historyDataView.Table.Rows[i][1].ToString();
                        break;
                }
                // TIMESTAMP
                TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + historyDataView.Table.Rows[i][2].ToString() + " - " + reasonOwner + "\r\n";
                // FSC-REASON
                TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + reason + "\r\n";
                TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + "------------------------------------------------------------------------- \r\n";
            }
            LabelLatestSPReason.Text = dataview[dataview.Find(actid)]["TIMESTAMP"].ToString();
            LabelLatestSPReason.Text = LabelLatestSPReason.Text + "<br />" + dataview[dataview.Find(actid)]["SP_Reason"].ToString();
            LabelSerialNo.Text = dataview[dataview.Find(actid)]["SerialNumber"].ToString();
            LabelWorkFlow.Text = dataview[dataview.Find(actid)]["WorkFlowDescription"].ToString();
        }


sirius -> Meningen er at udtrækket bliver indlæst i et dataview og herfra
Avatar billede sirius Nybegynder
18. maj 2009 - 22:17 #6
Det giver lidt mere mening når man kan se sammenhænget :-)

Første ting.
Den kode som du skriver i din codebehind bliver udført på serveren og ikke på klienten, så din server bliver ikke mindre belastet af at sortere i viewet frem for på SQL serveren.

Anden ting.
prøv at bruge
historyDataView.Sort = "TIMESTAMP DESC";
og når du så henter data fra dit view brug
historyDataView[i][0].ToString();
i stedet for
historyDataView.Table.Rows[i][0].ToString();
når du henter data fra dit view
Avatar billede anders_cp Nybegynder
18. maj 2009 - 22:59 #7
--> Første ting
Jeg troede at dataviewet svarede til en variabel alla' int a, der ligger sig i rammen på klienten... måske der er noget jeg har misforstået.


Anden ting:
Dit forslag har jeg prøvet uden held, og jeg forstår det simpelthen ikke. Som en sidste ting vil jeg give dig min Stored Procedure (men jeg tvivler selv på at det skulle have noget at sige:

SELECT 
FSCRejectionReason
, SPRectionReason
, [TIMESTAMP]
, UserID AS Useridentification
, HistoryType =
    CASE
        WHEN HistoryType = 'INSERT' THEN 'Fujitsu'
       
        WHEN HistoryType = 'UPDATE' THEN
            ( SELECT FullName
            FROM Users WHERE UserID = fscRevisedActivities_History.UserID
            )
    END
FROM
    fscRevisedActivities_History
    WHERE ActivityID = @ActivityID
    AND HistoryType IN ('UPDATE', 'INSERT')
    END
GO



Men hvis du har ret i anden ting vil en "order by" være fint nok...?
Avatar billede sirius Nybegynder
18. maj 2009 - 23:24 #8
Jeg forstår det heller ikke.

Prøv eventuelt at skrifte din for løkke ud med:

foreach (var row in dataset.Tables[0].Select("", "TIMESTAMP DESC"))
{
    reasonOwner = row[4].ToString();

    switch (reasonOwner.ToLower())
    {
        case "fujitsu":
            reason = row[0].ToString();
            break;
        default:
            reason = row[1].ToString();
            break;
    }
    // TIMESTAMP
    TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + row[2].ToString() + " - " + reasonOwner + "\r\n";
    // FSC-REASON
    TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + reason + "\r\n";
    TextBoxHistoryReason.Text = TextBoxHistoryReason.Text + "------------------------------------------------------------------------- \r\n";
}
Avatar billede anders_cp Nybegynder
19. juli 2009 - 19:44 #9
Undskyld det lange fravær. Jeg havde rent glemt denne tråd. Problemet er blevet løst med en "Order By" i sql'en. Jeg takker mange gange for jeres medvirken til at løse mit problem :-)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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