Avatar billede danisher Nybegynder
12. marts 2006 - 14:49 Der er 21 kommentarer og
1 løsning

Side inddeling med objectdatasource

Hejsa eksperter

Jeg har et ønske om at vise et antal rækker fra en database pr. side, som jeg har ladet gøre ved brug af GridView og ObjectDataSource i .NET 2.0.

Jeg har sat den til at vise 6 rækker pr. side, og det hele fungerer som det skal. Jeg har så lavet metoden i ObjectDataSourcen således, at den på nogen sider returnerer 6 rækker, nogen 3 rækker, nogen 5 rækker osv. Spørgsmålet er så, hvordan jeg kan få GridView'et til at sende antallet af viste rækker tilbage til metoden?

Man opstiller metoderne således:
public int SelectCount(int survey_id, ObjectDataSourceSelectingEventArgs e)...

public QuestionCollection SelectQuestionList(int survey_id, ObjectDataSourceSelectingEventArgs e) ...

public QuestionCollection SelectQuestionList(int survey_id, ObjectDataSourceSelectingEventArgs e, int maximumRows, int startRowIndex) ...

SelectQuestionList med flest argumenter, er den som gør hele arbejdet. GridView'et kalder automatisk metoden med startRowIndex med antallet af rækker man har set. Det er så denne variabel jeg godt kunne tænke mig at "override", ved at sende antallet af viste rækker plus det tidligere offset med til metoden i stedet...

Kan det lade sig gøre?

På forhånd tak!

mvh
Avatar billede dr_chaos Nybegynder
12. marts 2006 - 15:58 #1
er det noget i denne stil du leder efter:
http://unboxedsolutions.com/sean/archive/2005/12/28/818.aspx
Avatar billede danisher Nybegynder
12. marts 2006 - 16:51 #2
Det er faktisk den side jeg startede med...

Men jeg kan desværre ikke få det til at virke. Det virker fint, hvis jeg bare skal vise 6 rækker pr. side. Men når jeg nu i while loopen laver en break, forårsager det, at den kun viser f.eks. 3 rækker. Men GridView'et sender stadig 6 rækker mere til startRowIndex, som egentlig kun skulle være steget med 3, da jeg kun viser 3 på siden..

Ideer?
Avatar billede nielslbeck Nybegynder
15. marts 2006 - 07:38 #3
Du kunne evt. gøre som Sean Chase gør i sin anden artikel om emnet (http://www.unboxedsolutions.com/sean/archive/2006/01/21/843.aspx). Du kunne nemlig bruge HttpContext.Current.Items, hvor du i SelectQuestionList(int survey_id, ObjectDataSourceSelectingEventArgs e, int maximumRows, int startRowIndex) går ind og gemmer antallet af rækker du har sendt. Når du så får det andet kald, kan du udlæse hvor mange rækker du allerede har leveret, og så benytte dette tal i stedet for maximumRows.
Avatar billede nielslbeck Nybegynder
15. marts 2006 - 10:34 #4
Tilsvarende skal du naturligvis lægge antallet af rækker du allerede har sendt til startRowIndex :-)
Avatar billede dr_chaos Nybegynder
15. marts 2006 - 10:39 #5
Kan du ikke få antal viste rækker med gridview.pagesize ?
Avatar billede danisher Nybegynder
15. marts 2006 - 11:27 #6
Hmm, jeg synes ikke jeg kan få det til at virke...

HttpContext.Current.Items["rowCountCurrent"] og rowCountTotal er Null, når jeg i debuggeren kommer ind i metoden SelectQuestionList.

public QuestionCollection SelectQuestionList(int survey_id, int maximumRows, int startRowIndex)
    {
        QuestionCollection questionCollection = new QuestionCollection();
        QuestionItem questionItem;
        if (HttpContext.Current.Items["rowCountCurrent"] != null)
        {
            maximumRows -= (int)HttpContext.Current.Items["rowCountCurrent"];
            startRowIndex += (int)HttpContext.Current.Items["rowCountCurrent"];
        }

        using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["valuemakerConnectionString"].ConnectionString))

        using (SqlCommand command = new SqlCommand("ValuePerformGetQuestionList", connection))
        {
            connection.Open();
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@survey_id", survey_id);
            command.Parameters.AddWithValue("@pagestart", startRowIndex);
            command.Parameters.AddWithValue("@pagesize", maximumRows);
            command.Parameters.Add(new SqlParameter("@numresults", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, null, DataRowVersion.Default, 0));

            int companytype_id, rowCounter;
            companytype_id = rowCounter = 0;

            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    questionItem = new QuestionItem();
                    questionItem.Companytype_id = reader.GetInt32(1);
                    // Rest of Properties snipped

                    if (companytype_id != questionItem.Comapanytype_id && rowCounter > 0)
                        break;
                    companytype_id = questionItem.Comapanytype_id;

                    questionCollection.Add(questionItem);
                    rowCounter++;
                }
            }
            HttpContext.Current.Items["rowCountCurrent"] = rowCounter;
            HttpContext.Current.Items["rowCountTotal"] = command.Parameters["@numresults"].Value;
        }
        return questionCollection;
    }

Hvad gør jeg galt? Hvad KAN jeg gøre galt, siden den bare ikke opfører sig som I anbefaler?
Avatar billede dr_chaos Nybegynder
15. marts 2006 - 12:34 #7
prøv med
HttpContext.Current.Items["rowCount"]
Avatar billede dr_chaos Nybegynder
15. marts 2006 - 12:34 #8
Avatar billede nielslbeck Nybegynder
15. marts 2006 - 12:37 #9
HttpContext.Current.Items["rowCountCurrent"] skulle helst være null første gang du kommer ind i metoden. Men anden gang skulle den meget gerne indeholde antallet af rækker, som du returnerede under sidste kald til metoden. Er den også null ved andet kald???
Avatar billede danisher Nybegynder
15. marts 2006 - 12:45 #10
Ja, den er null første gang... Jeg er jo ikke helt komplet idiot...

Anden gang er den også NULL, og ja, det er det samme med rowCount også, hvis det dog skulle have nogen effekt..
Avatar billede nielslbeck Nybegynder
15. marts 2006 - 13:07 #11
Okay... det virker godt nok mærkeligt! Må jeg lige kigge nærmere på, når jeg kommer fra uni :-)
Avatar billede dr_chaos Nybegynder
15. marts 2006 - 16:45 #12
prøv at indarbejde denne metode:
  public OrderCollection Select(int maximumRows, int startRowIndex, ObjectDataSourceSelectingEventArgs e)

    {     

        using (SqlConnection connection = new SqlConnection("Initial Catalog=Northwind;Integrated Security=SSPI;Data Source=."))

        using (SqlCommand command = new SqlCommand("SeanPagerProc", connection))

        {

            connection.Open();

            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.AddWithValue("@pagestart", startRowIndex);

            command.Parameters.AddWithValue("@pagesize", maximumRows);

            command.Parameters.Add(new SqlParameter("@numresults", SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, null, DataRowVersion.Default, 0));

            OrderCollection orders = new OrderCollection();

            using(SqlDataReader reader = command.ExecuteReader())

            {

                while (reader.Read())

                {

                    Order o = new Order();

                    //missing null checks, has hard-coded column ordinals...it's all bad

                    o.ContactName = reader.GetString(2);

                    o.CustomerId = reader.GetString(1);

                    o.OrderDate = reader.GetDateTime(4);

                    o.OrderId = reader.GetInt32(3);

                    o.ProductId = reader.GetInt32(5);

                    o.ProductName = reader.GetString(6);

                    o.UnitPrice = (float)reader.GetDecimal(7);

                    orders.Add(o);

                }

            }

            e.Arguments.TotalRowCount = (int)command.Parameters["@numresults"].Value;

            return orders;

        }

    }
Avatar billede dr_chaos Nybegynder
15. marts 2006 - 16:46 #13
altså med ObjectDataSourceSelectingEventArgs e
Avatar billede danisher Nybegynder
19. september 2006 - 11:23 #14
Yes, nu funker det... Har fået lavet en klasse, som bruger ovenstående! Takker!
Avatar billede danisher Nybegynder
19. september 2006 - 11:23 #15
Lukker
Avatar billede nielslbeck Nybegynder
19. september 2006 - 12:00 #16
Hmm... var det ikke dr_chaos der skulle have haft de points? Hvis du har lavet en klasse som bruger hans svar, var det vel ham der skulle have haft points - og ikke dig selv?
Avatar billede danisher Nybegynder
19. september 2006 - 12:09 #17
jo far, men nu har den været åben lidt for længe
Avatar billede dr_chaos Nybegynder
19. september 2006 - 12:12 #18
Du bad mig jo aldrig lægge et svar.
Avatar billede nielslbeck Nybegynder
19. september 2006 - 12:18 #19
Det var da en utrolig dårlig grund til at beholde sine points selv... især når grunden til, at den har været åben lidt for længe er din egen...

Så vidt jeg kan se, kom dr_chaos' svar kun 4 timer efter dit sidste indlæg. Så det er jo ikke fordi dr_chaos har ventet et halvt år med at komme med et svar - det er vist dig, der har ventet et halvt år (="lidt for længe")...
Avatar billede danisher Nybegynder
19. september 2006 - 12:22 #20
Det beklager jeg da meget. Kan godt se de 100 point er meget vigtige. Jeg opretter et nyt spørgsmål, som du kan besvare dr_chaos.
Avatar billede dr_chaos Nybegynder
19. september 2006 - 12:25 #21
Det er ikke fordi de er vigtige.
Jeg mangler ikke ligefrem.
Det er mere princippet som også nielslbeck skriver.
Avatar billede nielslbeck Nybegynder
19. september 2006 - 12:28 #22
Det er såmænd ikke fordi 100 points er særlig vigtige... det var mere princippet i det. Eksperten.dk er et sted hvor man kan hjælpe hinanden. Er der en bruger der hjælper en anden bruger ved at give et rigtigt svar på et spørgsmål, udløser det en mængde points bestemt af brugeren der har et spørgsmål. At brugeren med spørgsmålet så kommer et halvt år efter og lukker spørgsmålet uden at give de aftalte points til brugeren med det korrekte svar - det er lidt forkert brug af sitet... og hvis man går op i points, kan 100 points her og 100 points der vel godt betyde noget i sidste ende?

Men som sagt er det mest princippet i det... jeg kan under alle omstændigheder være ret ligeglad - for jeg skal alligevel ikke ha' nogen points :-)
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