Men kan det laves med datagrid, for når jeg trykker save skal den selfølgelige gemme i databasen, men jeg skal desuden lave før der gemmes, og der skal jeg ha brugerid og lave nogle kald og herefter skal der gemmes i db?
void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { // nu ved jeg så ikke hvilken base du bruger - men her et eksempel med mysql MySqlConnection con = new MySqlConnection("Data Source=...;Database=...;User ID=...;Password=...;"); MySqlCommand command = new MySqlCommand("select id,Name from users", con); MySqlDataAdapter adapter = new MySqlDataAdapter(command);
// et dataset der proppes i session PageData = new DataSet(); adapter.Fill(PageData);
Der er både et eksempel på en særlig "knap-kolonnetype" som datagriddet tilbyder, og et eksempel på en kolonne med en knap som du i højere grad styrer selv.
du kan jo lige tage et kig på det - og se om der er noget af det der giver mening.... ellers må du råbe op :o)
Det her også nok :o) <asp:TemplateColumn HeaderText="Id"> <ItemTemplate> <asp:Label id="lblId" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Id") %>' /> </ItemTemplate> </asp:TemplateColumn>
(men copy/paste er kommet for at blive ;o)
Den nemmeste måde at angive en specifik bunden tekstkolonne er for øvrigt sådan her : <asp:BoundColumn HeaderText="test" DataField="Id" />
Men den vil som default rendere sig selv som en textbox når rækken sættes i "editmode", og det er lidt fjollet med et autogenereret id... hvis det er sådan et du har.
hvis du bare vil have renderet indholdet af din tabel behøver du sådan set slet ikke angive noget på griddet.... prøv evt. at fjerne AutogenerateColumns="false" i det eksempel jeg sendte - så kan du se hvad der sker. du kan sådan nøjes med dette så : <asp:DataGrid id="grid" runat="server" OnEditCommand="grid_EditCommand" OnCancelCommand="grid_CancelCommand" OnUpdateCommand="grid_UpdateCommand" ></asp:DataGrid>
der er masser af grunde til at lægge dine data i session, og ligeså mange grunde til at lade være :o)
pr. default vælter et datagrid sin initialtilstand ud til klienten i viewstate, hvilket koster båndbredde + den tid serveren bruger på at generere og dekode viewstate. hvis du gemmer din tilstand (i det her tilfælde dit dataset) på serveren koster det hukommelse på serveren, og hvis du vælger at hente det fra basen hver gang koster det kommunikation med den.
.... det er sådan lidt en pest, tyfus eller kolera ting :o)
void Page_Load(object sender, EventArgs e) { Response.BufferOutput = false; Response.Flush(); if(!IsPostBack) { // nu ved jeg så ikke hvilken base du bruger - men her et eksempel med mysql MySqlConnection con = new MySqlConnection("Data Source=localhost;Database=Schmiedmann;User ID=root;Password=;"); MySqlCommand command = new MySqlCommand("select id,Name from users", con); MySqlDataAdapter adapter = new MySqlDataAdapter(command);
// et dataset der proppes i session PageData = new DataSet(); adapter.Fill(PageData);
// og bind BindGrid(); } else { BindGrid(); } }
og ændrer lidt på den måde du angiver griddet til : <asp:DataGrid id="grid" runat="server" autogeneratecolumns="false" OnEditCommand="grid_EditCommand" OnCancelCommand="grid_CancelCommand" OnUpdateCommand="grid_UpdateCommand" OnItemDataBound="grid_ItemDataBound" enableViewState="false">
kan du se - at der ikke renderes viewstate til klienten (prøv en view-source på siden før og efter ændringen... så kan de se hvad jeg mener).
du kan prøve at se eksemplet på "custom-knappen".... der sættes id'et som CommandArgument på knappen, hvilket er en måde at gøre det på (der er dog andre). mvh
et alternativ er sådan her : <asp:TemplateColumn HeaderText="" visible="false"> <ItemTemplate> <asp:Label id="lblId" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Id") %>' /> </ItemTemplate> </asp:TemplateColumn>
... hvor du så stadig kan finde id'et sådan her : Response.Write(String.Format("Opdaterer bruger med id {0}", ((Label)e.Item.FindControl("lblId")).Text));
Hvis du ikke bruger viewstate bliver du nødt til at databinde hver gang, og igen hvis du ændrer på tilstanden. bruger du viewstate behøver du kun binde når du ændrer tilstanden. (kontrollen - altså griddet skal retableres på serveren, hvilket kan ske udfra viewstate eller ved en binding). 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.