Avatar billede jespera Nybegynder
18. marts 2005 - 15:36 Der er 17 kommentarer og
1 løsning

Lav TextBokse ud fra et dataset med en edit og save knap - C#

Hej Alle,

Jeg har et DataSet som er udfyldt med data fra DB.

I denne har jeg så MitDataSet.Tables[1] nogle relevante informationer som jeg godt vil have trukket ud i en:

Textbox som tager brugernavn fra db
En edit knap så sætter textbox til enable
En save knap som updateder brugernavn ud fra id

Ovenstående teskbox skal laves dynamisk. Så hvis der er 5 brugere så skal der være 5 textbokse med tilhørende knapper....

Jeg programmer i c# :-)

Er der nogle der har et bud.....
Avatar billede jaffafo Nybegynder
18. marts 2005 - 15:43 #1
du kan smide det i et Datagrid.

SÅ laver du bare et customtemplate hvor du smider en knap ind eller to :)
Avatar billede jespera Nybegynder
18. marts 2005 - 15:46 #2
kunne du give et eksepmel så ? Det er ikke bare for mig :--)
Avatar billede jespera Nybegynder
18. marts 2005 - 16:17 #3
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?
Avatar billede jespera Nybegynder
18. marts 2005 - 17:08 #4
Ingen der kan komme med et eksempel....?
Avatar billede snepnet Nybegynder
18. marts 2005 - 17:13 #5
du kan godt få et eksempel.... bruger du normalt visual studio, eller vil du hellere have et eksempel alá notepad/webmatrix ?
mvh
Avatar billede jespera Nybegynder
18. marts 2005 - 17:15 #6
Ala notepad ville være pefekt... :-)
Avatar billede jespera Nybegynder
18. marts 2005 - 18:36 #7
Glæder mig til at se et forlag og brugen af datagrid
Avatar billede snepnet Nybegynder
18. marts 2005 - 18:44 #8
Sorry.... der kom lige et par småting op :o)

Du kan få et eksempel her :

<%@ Page Language="C#" %>
<%@ assembly name="MySql.Data" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Web.UI.WebControls" %>
<script runat="server">
    protected DataSet PageData
    {
      get{return (DataSet)Session["PageData"];}
      set{Session["PageData"] = value;}
    }

    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);

            // og bind
            BindGrid();
        }
    }

    protected void BindGrid()
    {
        grid.DataSource = PageData;
        grid.DataBind();
    }

    private void grid_EditCommand(object source, DataGridCommandEventArgs e)
    {
        grid.EditItemIndex = e.Item.ItemIndex;
        BindGrid();
    }

    private void grid_CancelCommand(object source, DataGridCommandEventArgs e)
    {
        grid.EditItemIndex = -1;
        BindGrid();
    }

    private void grid_UpdateCommand(object source, DataGridCommandEventArgs e)
    {
        Response.Write(String.Format("Opdaterer bruger med id {0}", ((Label)e.Item.FindControl("lblId")).Text));
        grid.EditItemIndex = -1;
        BindGrid();
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        string id = btn.CommandArgument;
        Response.Write(String.Format("Du har klikket på brugeren med Id {0}", id));
    }
</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:DataGrid id="grid" runat="server" autogeneratecolumns="false" OnEditCommand="grid_EditCommand" OnCancelCommand="grid_CancelCommand" OnUpdateCommand="grid_UpdateCommand">
        <Columns>
            <asp:TemplateColumn HeaderText="Id">
                <ItemTemplate>
                    <asp:Label id="lblId" runat="server" enabled="false" Text='<%# DataBinder.Eval(Container.DataItem,"Id") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:Label id="lblId" runat="server" enabled="false" Text='<%# DataBinder.Eval(Container.DataItem,"Id") %>' />
                </EditItemTemplate>
            </asp:TemplateColumn>
            <asp:TemplateColumn HeaderText="Navn">
                <ItemTemplate>
                    <asp:TextBox id="txtId" runat="server" enabled="false" Text='<%# DataBinder.Eval(Container.DataItem,"Name") %>' />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:TextBox id="txtId" runat="server" enabled="true" Text='<%# DataBinder.Eval(Container.DataItem,"Name") %>' />
                </EditItemTemplate>
            </asp:TemplateColumn>
            <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit" />
            <asp:TemplateColumn HeaderText="Knap">
                <ItemTemplate>
                    <asp:Button id="btnSave" runat="server" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"Id") %>' Text="Gem" OnClick="btnSave_Click" />
                </ItemTemplate>
            </asp:TemplateColumn>
        </Columns>
        </asp:DataGrid>
    </form>
</body>
</html>

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)

mvh
Avatar billede jespera Nybegynder
18. marts 2005 - 19:20 #9
Hold da helt ferie det er smart det DataGrid. Men jeg forstår ikke helt hvorfor at du man skriver nogle dele 2 gange altså:

<ItemTemplate>
                <asp:Label id="lblId" runat="server" enabled="false" Text='<%# DataBinder.Eval(Container.DataItem,"id") %>' />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label id="lblId" runat="server" enabled="false" Text='<%# DataBinder.Eval(Container.DataItem,"id") %>' />
            </EditItemTemplate>

Er du ikke flink at give en forklaring på det

Desuden undrede jeg mig over denne:

protected DataSet PageData
    {
      get{return (DataSet)Session["PageData"];}
      set{Session["PageData"] = value;}
    }

Hvorfor er den proteced og er det nødvendigt at smide den i en session (fordele/ulempe)....

Jeg kastede lige 30 point mere på......blev super glad for dit svar.....
Avatar billede snepnet Nybegynder
18. marts 2005 - 19:46 #10
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)

mvh
Avatar billede snepnet Nybegynder
18. marts 2005 - 19:48 #11
hvis du laver denne ændring i page_load

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).

mvh
Avatar billede jespera Nybegynder
18. marts 2005 - 19:52 #12
Hahaha ja det kan jeg godt, tak for svaret :-)

Men hvis nu jeg fjerner lablen med id, hvordan kan jeg så få fat i brugerens id. Skal nemlig bruge id i det videre forløb. ?
Avatar billede snepnet Nybegynder
18. marts 2005 - 20:02 #13
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
Avatar billede snepnet Nybegynder
18. marts 2005 - 20:05 #14
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));

mvh
Avatar billede jespera Nybegynder
18. marts 2005 - 20:13 #15
Arh ja det kan jeg da godt bruge, meget smart.....

Jamen det var jo det i første omgang indtil jeg stiller et nyt......haha

Velfortjene point til dig......( husk læg svar :-) )

Fortsat god weekend...
Avatar billede jespera Nybegynder
18. marts 2005 - 20:21 #16
Ups lige en hurtigt......Er det nødvendig at BindGrid hver gang? og så bare flytte PageData ned i !IsPostBack
Avatar billede snepnet Nybegynder
18. marts 2005 - 21:27 #17
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
Avatar billede jespera Nybegynder
19. marts 2005 - 15:33 #18
Okay jeg takker
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