Avatar billede Slettet bruger
07. januar 2006 - 13:52 Der er 13 kommentarer og
1 løsning

Gridvies og ObjectDataSource control

Hejsa,

Jeg er lige begyndt med ASP.NET 2.0 og det ser jo spændende ud.
Jeg sidder og leger lidt med en "Master/Detail page" - altså hvor der både er en kontrol (her et gridview) til fremvisning af nogle headers og id'er, samt en kontrol (detailsview), hvor selve nyheden, der er valgt i gridview fremvises.

Til hentning af data fra min dataklasse bruger jeg ObjectDataSources - altså både til hentning af headers og til hentning af hele nyhedsobjekter, der er valgt fra gridview.

Mit gridwiew til headers virker fint, men når jeg starter op med mit detailsview går det galt.
Jeg får følgende fejl når siden startes op:

********************************************************
Data keys must be specified on GridView 'GridView1' before the selected data keys can be retrieved.  Use the DataKeyNames property to specify data keys.
********************************************************

Jeg har æavet en lignende side, hvor headers blev hentet med en ObjectDataSource, men hvor de blev vist i en fropdownbox. Dette virkede fint nok.

Mine metoder i dataklassen er som følger:

Metode til hentning af headers:
[DataObjectMethod(DataObjectMethodType.Select)]
    public static List<Nyhed> GetHeaders()
    {
        DbConnection conn = new DbConnection();
        MySqlConnection connection = conn.OpenConnection();

        MySqlCommand command = new MySqlCommand();
        command.CommandText = "SELECT Id, Dato, Overskrift FROM Nyheder ORDER BY Id DESC";
        command.Connection = connection;

        List<Nyhed> newsList = new List<Nyhed>();

        MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);

        while (reader.Read())
        {
            Nyhed n = new Nyhed();
            n.Id = reader.GetInt32(0);
            n.Dato = reader.GetString(1);
            n.Overskrift = reader.GetString(2);

            newsList.Add(n);
        }
        reader.Close();

        return newsList;
    }

Min metode til hentning af en valgt nyhed:
[DataObjectMethod(DataObjectMethodType.Select)]
    public static Nyhed GetNews(Nyhed n)
    {       
        DbConnection conn = new DbConnection();
        MySqlConnection connection = conn.OpenConnection();

        MySqlCommand command = new MySqlCommand();
        command.CommandText = "SELECT * FROM Nyheder WHERE Id = '" + n.Id + "'";
        command.Connection = connection;

        MySqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);

        if (reader.Read())
        {
            n.Id = reader.GetInt32(0);
            n.Dato = reader.GetDateTime(1).ToString();
            n.Overskrift = reader.GetString(2);
            n.Nyhedstekst = reader.GetString(3);
            n.Billede = reader.GetString(4);
            n.Skribent = reader.GetString(5);
        }
        reader.Close();

        return n;
    }

Som det kan ses benytter jeg generics hvor data lægges på objekter og kan tilgås derfra.
Jeg benytter endvidere i dette tilfælde de føromtalte ObjectDataSource-kontroller til hentning af data fra det "underliggende lag".

Jeg kunne formentlig lige så godt benytte SqlDataSource-kontroller, men vil helst gøre det på denne måde, da jeg vil have den størst mulige fleksibilitet og den mindst mulige afhængighed i forhold til den underliggende database.

Nogen der kan hjælpe?
Avatar billede Slettet bruger
07. januar 2006 - 13:55 #1
Skal lige tilføje at jeg har forsøgt at specificere den omtalte data key property på gridview1 - her både som et enkeltstående id (der er den unikke kolonne i tabellen), samt med en række af alle kolonner i tabellen sepereret med komma.

Uden held altså :-)
Avatar billede dr_chaos Nybegynder
08. januar 2006 - 10:15 #2
hvordan ser koden til dit gridview ud ?
Avatar billede Slettet bruger
08. januar 2006 - 12:33 #3
Hejsa,

Det gridview hvor nyhedsoverskrifterne vises og hvor man kan vælge specifikke nyheder til udviddet visning ser ud som:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
        DataSourceID="ods_GetHeaders" CellPadding="4" DataKeyNames="Id" ForeColor="#333333" GridLines="None" PageSize="5" ShowHeader="False" Width="500px">
        <Columns>
            <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
            <asp:BoundField DataField="Dato" HeaderText="Dato" SortExpression="Dato" />
            <asp:BoundField DataField="Overskrift" HeaderText="Overskrift" SortExpression="Overskrift" />
            <asp:BoundField DataField="Skribent" HeaderText="Skribent" SortExpression="Skribent" />
            <asp:CommandField ShowSelectButton="True" />
        </Columns>
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <RowStyle BackColor="#EFF3FB" />
        <EditRowStyle BackColor="#2461BF" />
        <SelectedRowStyle BackColor="#C0FFC0" Font-Bold="True" ForeColor="#333333" />
        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <AlternatingRowStyle BackColor="LightGray" />
    </asp:GridView>

Mit detailsview hvor nyhederne fremvises:

<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="ods_GetNews"
        Height="50px" Width="125px">
        <Fields>
            <asp:BoundField DataField="Overskrift" HeaderText="Overskrift" SortExpression="Overskrift" />
            <asp:BoundField DataField="Billede" HeaderText="Billede" SortExpression="Billede" />
            <asp:BoundField DataField="Nyhedstekst" HeaderText="Nyhedstekst" SortExpression="Nyhedstekst" />
            <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" />
            <asp:BoundField DataField="Skribent" HeaderText="Skribent" SortExpression="Skribent" />
            <asp:BoundField DataField="Dato" HeaderText="Dato" SortExpression="Dato" />
        </Fields>
    </asp:DetailsView>

Det skal lige siges at jeg nu sikkert har ændret en smule i detailsview, da dette var fjernet fra siden og nu igen er indsat for at vise hvordan det overordnet er opbygget.

Det sjove er, at jeg nu ikke får den føromtalte parameter-fejl, men i stedet en:

Object reference not set to an instance of an object.
Avatar billede dr_chaos Nybegynder
08. januar 2006 - 12:43 #4
hvor får du den fejl ?
Avatar billede Slettet bruger
09. januar 2006 - 10:32 #5
I linie 64 i min dataklasse.

Line 63:        MySqlCommand command = new MySqlCommand();
Line 64:        command.CommandText = "SELECT * FROM Nyheder WHERE Id = '" + n.Id + "'";
Line 65:        command.Connection = connection;

Det er tilsyneladende ikke muligt at benytte nyhed.Id til at udvælge data med?
Avatar billede Slettet bruger
09. januar 2006 - 10:35 #6
Eller er der noget galt med den kbling der skulle være mellem gridview1 (nyheds headers) og det detailsview der skal fremvise nyheden?

Med den object reference kunne det jo se ud som om at der ikke bliver sendt et object af typen nyhed med ned til den metode der henter hele nyheden ud.
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 10:37 #7
n.id bliver jo først sat senere.
Avatar billede Slettet bruger
09. januar 2006 - 11:12 #8
Som jeg har forstået det (og det er jo ret nyt), så sendes hele nyheds-objektet med ned til metoden når et specifikt nyheds-objekt vælges i gridview1.

Herefter kan den unikke tabel-nøgle (her id) findes ved at benytte nyheds-objektets property Id.

Heraf n.Id

Er der noget basalt jeg har misforstået?
Avatar billede Slettet bruger
09. januar 2006 - 11:13 #9
Og hvornår bliver n da sat?
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 11:15 #10
som det ser ud er nyhed som du får ind i public static Nyhed GetNews(Nyhed n)
ikke sat.
du må prøve at finde ud af hvad der er tilgængeligt i GetNews.
Avatar billede Slettet bruger
09. januar 2006 - 11:18 #11
Ok. Ja det forklarer jo så den manglende reference, men hvordan skal jeg så sætte den?

Jeg troede netop at gridview1 stod for dette - altså når en nyhed blev valgt fra gridview1 ville objektet blive sendt med ned til den underliggende metode i dataklassen hvor properties på n ville være tilgængelige som normale parameterværdier.

Ellers kan jeg ikke umiddelbart se fidusen i denne måde at bygge op på.
Avatar billede Slettet bruger
09. januar 2006 - 11:29 #12
Du har ret. Det ser ikke ud til at der bliver sendt et objekt med tilbage.
Hvis jeg der i mod opretter et nyt objekt i metoden:

Nyhed n2 = new Nyhed();

Og sætter værdierne fra DB på det:

n2.Id = reader.GetInt32(0);
            n2.Dato = reader.GetString(1);
            n2.Overskrift = reader.GetString(2);
            n2.Nyhedstekst = reader.GetString(3);
            n2.Billede = reader.GetString(4);
            n2.Skribent = reader.GetString(5);

Så vil siden gerne afvikle.
Dog får jeg ikke nogen nyhed frem :-)
Avatar billede Slettet bruger
12. januar 2006 - 17:10 #13
Slet ingen eksperter der lige umiddelbart kan gennemskue problemet?
Jeg er ret newbie på netop ASP.NET 2.0 området så det ville være fedt hvis nogen havde erfaringer med netop dette :-)
Avatar billede Slettet bruger
15. januar 2006 - 13:57 #14
Har løst problemet midlertidigt.
Jeg har ændret i metoden til udtrækning af en specifik nyhed så den modtager et id i stedet for et nyheds-objekt. Det løste null-reference problemet og det virker.

Det ville dog være mere optimalt hvis man kunne sende hele objektet med, men det må så vente.
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