07. januar 2006 - 13:52Der 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;
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;
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.
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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.
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.
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?
Synes godt om
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.
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.
Synes godt om
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å.
Synes godt om
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:
Så vil siden gerne afvikle. Dog får jeg ikke nogen nyhed frem :-)
Synes godt om
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 :-)
Synes godt om
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.
Synes godt om
Ny brugerNybegynder
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.