09. oktober 2004 - 11:52Der er
37 kommentarer og 1 løsning
Hjælp til gæstebog
Hej jeg sider og prøver at lære lidt asp.net, men jeg har skrivet c# i et par månderner nu men jeg har et problem med at forstå noget i asp.net... jeg kan godt se når jeg laver en console eller en winform hvordan man kan smide et obj ind i et nyt obj og på den måde få det "flot" ud på skræmen men en ting som jeg ikke forstå i asp.net er hvordan får jeg den her data ud på min side, for jeg har fået fortalt at jeg ikke må kalde min database conn på .aspx side men jeg skal lave det hele i aspx.cs filen men hvordan får jeg lige min data over i aspx filen så? for hvis jeg bare udskriver den så kommer den i toppen af filen og hvis jeg laver et data grid så har jeg ikke den control med mit design som jeg ønsker...
mener du at hvis du bare udskriver med Response.Write() eller ?
Jeg er ikke sikker på at jeg sådan er helt med på hvad det helt konkret er du er ude efter, men ;
- Det er rigtig at et datagrid som udgangspunkt er ret intetsigende når man ikke gør noget ved det, men du ganske gode muligheder for tilpasning.
- Der findes andre kontroller der som et datagrid er gode til at fremvise gentagne dataelementer. Specielt en DataList og en Repeater kan den slags, og de giver hver især bedre frihed for at sikre et personligt UI end datagriddet gør. Det kræver så også lidt mere at få dem til at vise noget.
- Der er masser af muligheder for at styre hvad der kommer "på skærmen" fuldstændig som du har lyst til.
- Response.Write() kan ikke anbefales.
Kan du ikke stille et lidt mere konkret spørgsmål... Så skal jeg nok komme med et eksempel. Du kan også lægge noget kode ud, som du bruger nu - og som du er lidt utilfreds med... Så skal du få et bud.
den der Repeater har jeg læst op før og jeg tror det er noget i den stil men her er det html output som jeg ønsker udskrivet i et loop eller ind til mig rs er tomt
// hvis du har en form på siden med ID="Form1" protected HtmlForm Form1;
Jeg har her gået ud fra at du har en DataTable, og at kolonnerne hedder det samme som du har skrevet. (den kan du så kalde fra page_load).
// metode til at skrive tabellen ud - en datatable som parameter private void GenerateTable(DataTable dt) { // først en tabel Table tbl = new Table; tbl.Width = 500;
// variable til rækker og celler TableRow tr; TableCell tc;
// for hver række i tabellen foreach(DataRow dr in dt.Rows) { // en ny række tr = new TableRow();
// celle til navn tc = new TableCell(); tc.Text = dr["Navn"].ToString(); tr.Cells.Add(tc);
// celle til email tc = new TableCell(); tc.Text = dr["Email"].ToString(); tr.Cells.Add(tc);
// celle til Hjemmeside tc = new TableCell(); tc.Text = dr["Hjemmeside"].ToString(); tr.Cells.Add(tc);
// rækken ind i tabellen tbl.Rows.Add(tr);
// ny række (den uden indhold) tr = new TableRow(); tc = new TableCell(); tc.ColSpan = 3; tc.Text = " ";
// og ind med den tbl.Rows.Add(tr); }
// og ind på formen med tabellen Form1.Controls.Add(tbl); }
string strSQL = "select Navn, Hjemmeside, Email, Tekst from tagwall order by id"; Db Open = new Db(strSQL); OleDbDataReader rs = Open.cmd.ExecuteReader();
nope... ikke umiddelbart, men du kan modificere det til at bruge en reader rimelig nemt :
// metode til at skrive tabellen ud - en datatable som parameter private void GenerateTable(OleDbDataReader reader) { // først en tabel Table tbl = new Table; tbl.Width = 500;
// variable til rækker og celler TableRow tr; TableCell tc;
// for hver række i tabellen while(reader.Read()) { // en ny række tr = new TableRow();
// celle til navn tc = new TableCell(); tc.Text = reader["Navn"].ToString(); tr.Cells.Add(tc);
// celle til email tc = new TableCell(); tc.Text = reader["Email"].ToString(); tr.Cells.Add(tc);
// celle til Hjemmeside tc = new TableCell(); tc.Text = reader["Hjemmeside"].ToString(); tr.Cells.Add(tc);
// rækken ind i tabellen tbl.Rows.Add(tr);
// ny række (den uden indhold) tr = new TableRow(); tc = new TableCell(); tc.ColSpan = 3; tc.Text = " ";
// og ind med den tbl.Rows.Add(tr); }
reader.Close();
// og ind på formen med tabellen Form1.Controls.Add(tbl); }
og jeps - du kan bare kalde den fra page_load... altså sådan her :
private void Page_Load(object sender, System.EventArgs e) { DataTable dt = GetTheData(...); // du har sikkert noget i den stil :o) GenerateTable(dt); }
og mht til det med hvor den bliver placeret, så er der ikke noget ballade med det. dels kan du sætte positionereringen med styles : tbl.Style.Add("position","absolute"); tbl.Style.Add("left","100px"); tbl.Style.Add("top","200px");
men det nemmeste er nok hvis du bare klasker et Panel ind i designeren (hvis du bruger VS eller WebMatrix), og så sørger for at smide tabellen ind i det :
hvis din placeholder hedder ph1 skifter du bare : Form1.Controls.Add(tbl); ud med ph1.Controls.Add(tbl);
og jeps - du kan bare kalde den fra page_load... altså sådan her :
private void Page_Load(object sender, System.EventArgs e) { DataTable dt = GetTheData(...); // du har sikkert noget i den stil :o) GenerateTable(dt); }
// metode til at skrive tabellen ud - en datatable som parameter private void GenerateTable(OleDbDataReader reader) { // først en tabel Table tbl = new Table(); tbl.Width = 500;
// variable til rækker og celler TableRow tr; TableCell tc;
string strSQL = "select Navn, Hjemmeside, Email, Tekst from tagwall order by id"; Db Open = new Db(strSQL); OleDbDataReader rs = Open.cmd.ExecuteReader();
// for hver række i tabellen while(reader.Read()) { // en ny række tr = new TableRow(); ... osv
jeg har lige fået gæster, men jeg skal nok vende tilbage... du kan lige se om du kan få det til at virke, og give en tilbagemelding - eventuelt med et par bemærkninger om hvilke dele du ikke helt kan følge. mvh :o)
Table er en serverkontrol, og det fulde navn er : System.Web.UI.WebControls.Table
Du kan betragte det som en serverkontrol ligesom alle andre f.eks. : System.Web.UI.WebControls.Button System.Web.UI.WebControls.Panel System.Web.UI.WebControls.PlaceHolder mvh
En serverkontrol er et element som du kan instantiere, og manipulere på serveren, og som renderer "noget" ud til klienten, og dette "noget" vil så typisk være noget html.
hvis du tilføjer en Button til dit kontroltræ, vil det i sidste ende bliver til : <input type="submit" osv ude hos klienten (altså i browseren).
Den benyttede System.Web.UI.WebControls.Table renderes så ud til klienten som en <table></table>
hvert TableRow renderes som <tr></tr>, og hver TableCell renderes som <td></td> og hvis du så tilføjer en TableCell til en TableRow sådan her :
TableRow tr = new TableRow(); TableCell tc = new TableCell(); tc.Text = "hej"; tr.Cells.Add(tc); // her tilføjes cellen til rækken
vil det resultere i : <tr> <tc>hej</tc> </tr>
og sætter du så din TableRow ind i en Table sådan her :
Table tbl = new Table(); // det fra før TableRow tr = new TableRow(); TableCell tc = new TableCell(); tc.Text = "hej"; tr.Cells.Add(tc); // her tilføjes cellen til rækken // rækken tilføjes tabellen tbl.Rows.Add(tr);
vil det resultere i dette : <table> <tr> <tc>hej</tc> </tr> </table>
Kan du følge det - eller er det helt sort snak ? (du spørger bare løs... så håber jeg at jeg kan forklare det på en eller anden måde så du synes det giver mening)
Table tbl = new Table(); // det fra før TableRow tr = new TableRow(); TableCell tc = new TableCell(); tc.Text = "hej"; tr.Cells.Add(tc); // her tilføjes cellen til rækken // rækken tilføjes tabellen tbl.Rows.Add(tr);
det vil sige at man starter med at lave <table> taget, så laver en en <tr> og i den <tr> tilføjer man en <td> hvor man har sætter et indhold (tekst)
men hvis nu jeg godt vil lave en 2 x 2 table? hvordan ser det lige ud?
Table tbl = new Table(); TableRow tr = new TableRow();
// // ind med 2 celler // // første celle TableCell tc = new TableCell(); tc.Text = "1"; tr.Cells.Add(tc); // her tilføjes cellen til rækken // anden celle TableCell tc = new TableCell(); tc.Text = "2"; tr.Cells.Add(tc); // her tilføjes cellen til rækken
// rækken tilføjes tabellen (og rækken indeholder så nu 2 celler tbl.Rows.Add(tr);
hov... 2x2... så skal du jo lige have en række og 2 nye celler sådan her :
// // ind med 2 celler // // første celle TableCell tc = new TableCell(); tc.Text = "1_1"; tr.Cells.Add(tc); // her tilføjes cellen til rækken // anden celle TableCell tc = new TableCell(); tc.Text = "1_2"; tr.Cells.Add(tc); // her tilføjes cellen til rækken tbl.Rows.Add(tr); // her tilføjes rækken til tabellen // // ind med en række med 2 celler til // tr = new TableRow(); TableCell tc = new TableCell(); tc.Text = "2_1"; tr.Cells.Add(tc); // her tilføjes cellen til rækken // anden celle TableCell tc = new TableCell(); tc.Text = "2_2"; tr.Cells.Add(tc); // her tilføjes cellen til rækken tbl.Rows.Add(tr); // her tilføjes rækken til tabellen
men sider lige og arbejde med at lave en constructors til at lave et OleDbDataReader som jeg så vil lave en get metode til. Men jeg få en fejl at den ikke kunne OleDbDataReader om til en string, kan man kun get en string?
det her er så lige fra et nyhed system men iden skulle være den samme
private OleDbDataReader Listen;
public Nyheder() { string strSQL = "select * from nyheder order by nyhed_id"; Db Conn = new Db(strSQL); Listen = Conn.cmd.ExecuteReader(); Conn.Close(); }
public string List { get { return Listen; } }
også ville jeg kalde List fra min aspx.cs fil men Return Listen skal være en string kan man løse det? eller er hele ide "dum"
hvis der nu er 10 nyheder.... hvordan ville du så returnerer dem som én string ? ... det giver ikke så meget mening synes jeg. hvorfor skal det være én string du får tilbage ?
Med hensyn til det med placeringen, så skrev jeg lidt om det her : 09/10-2004 18:44:58
Spanning på cellerne indgår her : 09/10-2004 18:06:07 (bare skift ColSpan ud med ColumnSpan jf. 09/10-2004 18:54:27)
Med hensyn til selve opbygningen af tabellen, så må du jo bare sætte kolonner og rækker ind indtil du synes det passer.... Du kan jo eventuelt bygge en statisk tabel op til at styre layoutet med, og så vælge en af cellerne som du så propper din dynamiske tabel ind i fra koden.
Men... fortæl lige hvilket udviklingsmiljø du bruger - så kan det nogen gange være lidt nemmere at være konkret omkring praktisk løsning.
Hej ameq :o) (ved ikke om du har læst min besked herude, men jeg har været væk den sidste uge). har du stadig problemer her, og er der noget "der hænger" ? mvh
jeg er på skole lige nu hvor vi har noget om asp.net og jeg vil lige vente med at bruge mere af dig tid, end til jeg ved hvor meget jeg lære på mit skole ophold for så kan det jo være at jeg selv kan løste mit problem.
men skal vi ikke sige at jeg skrive til dig når jeg er færdig, så kan vi se om jeg skal havde et svar eller hvordan?
jeg blic færdig i gå på skolen, så det går okey =) og ville til at snakker om design og layout i MS Visual Studio 2003.
For jeg har ikke rigtig fået løst mit program, jeg forstå godt det eks. med tablen... men er der ikke en anden og smadre måde at gøre det på? hvor meget design kan du lave på et datagrid?
du kan lave en hel del, men der er bedre muligheder med en datalist eller en repeater. det var fordi du spurgte om du kunne loope det ud du fik den med tabellen.
datagriddet er bedst til excell-stilen, så hvis du allerede fra starten ved at der stilles lidt mere avancerede krav til din liste bør du tage en af de andre. (de kræver så også at man laver lidt mere arbejde for at få noget på skærmen)
du er i hvert fald meget velkommen :o) (hvis du søger på msdn tror jeg du kan finde en stak sammenligninger af de 3 kontroller... fordele, ulemper og muligheder mv, men det kan du jo nok også finde andre steder på nettet) mvh
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.