Avatar billede simsen Mester
06. marts 2007 - 12:15 Der er 15 kommentarer og
1 løsning

Datagrid og editerbar checkbox

Hej,

Jeg har et DatagridView, hvor jeg har to checkboxe for hver række (Betalt og RykkerSendt). De fungerer fint nok, når jeg kører koden (viser de korrekte afkrydsninger, hentet fra databasen) MEN - jeg har ikke mulighed for at fjerne/sætte en afkrydsning (felterne er "grået ud").....hvordan får jeg dem hvide, så jeg har mulighed for at ændre status på afkrydsningerne og så efterfølgende gemme ved at klikke på en Gem knap?

Min kode:
aspx
                                        <asp:GridView ID="grdInvoiceList" runat="server" AutoGenerateColumns="False" Width="832px" DataKeyNames="KundeId" AllowSorting="True">
                                            <Columns>
                                                <asp:BoundField DataField="KundeID" HeaderText="Kunde id">
                                                    <HeaderStyle Width="65px" />
                                                </asp:BoundField>
                                                <asp:BoundField DataField="Dato" HeaderText="Faktura dato" >
                                                    <HeaderStyle Width="200px" />
                                                </asp:BoundField>
                                                <asp:BoundField DataField="PrisExMoms" HeaderText="Pris excl. moms" >
                                                    <HeaderStyle Width="100px" />
                                                </asp:BoundField>                                               
                                                <asp:CheckBoxField DataField="Betalt" HeaderText="Betalt">
                                                    <HeaderStyle Width="60px" />
                                                    <ItemStyle HorizontalAlign="Center" />
                                                </asp:CheckBoxField>
                                                <asp:CheckBoxField DataField="RykkerSendt" HeaderText="Rykker sendt">
                                                    <HeaderStyle Width="100px" />
                                                    <ItemStyle HorizontalAlign="Center" />
                                                </asp:CheckBoxField>                                               
                                                <asp:TemplateField>
                                                    <ItemTemplate>
                                                        <asp:ImageButton ID="btnSave" runat="server" ImageUrl="~/Images/Save.gif" />
                                                    </ItemTemplate>
                                                    <HeaderStyle Width="267px" />
                                                    <ItemStyle HorizontalAlign="Center" />
                                                </asp:TemplateField>                                               
                                            </Columns>
                                            <RowStyle BackColor="#7EAACB" />
                                            <EditRowStyle BorderStyle="Solid" BorderColor="#BFA776" />
                                            <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
                                            <PagerStyle BackColor="#EAF9FF" ForeColor="Black" HorizontalAlign="Center" Height="15px" />
                                            <HeaderStyle BackColor="#2F5673" Font-Bold="True" ForeColor="White" BorderColor="Transparent" BorderStyle="None" BorderWidth="0px" HorizontalAlign="Left" />
                                            <AlternatingRowStyle BackColor="#B4CDE0" BorderColor="Transparent" BorderWidth="0px" />
                                        </asp:GridView>

aspx.cs
try
            {
                if (api.GetInvoiceList(KundeId, ref GetInvoiceList) == FaktureringApi.FStatus.Success)
                {
                    ClearMessages();

                    panShowInvoiceList.Visible = false;
                    panHideInvoiceList.Visible = true;

                    grdInvoiceList.DataSource = GetInvoiceList.DefaultView;
                    grdInvoiceList.DataBind();
                                     

                    if (GetInvoiceList.Rows.Count == 0)
                    {
                        lblNoInvoice.Text = "Der er ikke oprettet noget endnu";
                        lblNoInvoice.Visible = true;
                    }
                }
            }
            catch
            { }

mvh
simsen :-)
Avatar billede snepnet Nybegynder
06. marts 2007 - 12:29 #1
Du kan indsætte et commandfield så du få mulighed for at sætte en række i "editmode".
<asp:CommandField ShowEditButton="True" />
Mvh
Avatar billede simsen Mester
06. marts 2007 - 12:41 #2
Hej snepnet

Jeg fik følgende fejl, når jeg trykkede på linket Edit:

The GridView 'grdInvoiceList' fired event RowEditing which wasn't handled.

Jeg kan så godt regne ud, jeg skal ind og lave noget i RowEditing........ men bare ikke hvad - gider du hjælpe mig?

mvh
simsen :-)
Avatar billede simsen Mester
06. marts 2007 - 12:43 #3
Og lige et spørgsmål - hvorfor skal jeg trykke på en knap/link, for at få den i edit mode - kan den ikke være det fra start af?

mvh
simsen :-)
Avatar billede snepnet Nybegynder
06. marts 2007 - 13:11 #4
Mht. fejlen - så er der mere end én vej frem.
Du kan lave "det hele manuelt" - der findes masser af eksempler på nettet, og jeg kan godt finde nogle til dig. Det er dog blot et spørgsmål om at abbonnere på de respektive events - og skrive lidt småkode histen og pisten... ikke det vilde.

Du kan også benytte en object datasource som arbejder op imod dine egne klasser/api'er.
De stiller så til gengæld nogle krav til dine klasser - men din code-behind vil så ikke være syltet ind i den slags kode... Det vil være pakket nogenlunde pænt ind.

De medfølgende muligheder du har omkring opdatering i et gridview er rækkebaseret, men du kan godt få editérbare kontroller ind i rækkerne istedet, hvis du laver templates... Det er ikke noget problem.

Her er et gridview der viser en editérbar tekstboks i alle rækker:

<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
    <ItemTemplate>
        <asp:TextBox ID="txtSomething" runat="server" Text='<%# Bind("PrisExMoms") %>' />
    </ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>


Mvh
Avatar billede simsen Mester
06. marts 2007 - 18:28 #5
Hej igen snepnet

Altså der er to muligheder:
- manuelt
- object datasource

Kan du linke mig til en "How to tutorial for dummies" på den der lettest at forstå?

Jeg forsøgte mig med TemplateField og så en checkbox (for det eneste der skal kunne ændres er kun de to checkboxe) - men kunne så ikke hitte ud af at få min true/false felt til at blive vist (med afkrydsning), når feltet for den pågældende række i databasen var true.

Den kom frem med en fejl når jeg forsøgte med Selected='<%#osv - at jeg ikke kunne lave en bind på den pågældende kontrol....

mvh
simsen :-)
Avatar billede snepnet Nybegynder
07. marts 2007 - 08:32 #6
Well ... Svært at sige hvad der er lettest at forstå - jeg synes du skal prøve at arbejde med begge dele.
Du kan se en video hvor der arbejdes med en sql server her:
http://www.asp.net/learn/videos/view.aspx?tabid=63&id=49
Du kan lave de samme numre op imod din egen objektmodel med en object datasource.

Selected='<%# Eval("Betalt") >' burde virke fint, og
Selected='<%# Bind("Betalt") >' skulle også være fin.

Får du nogle fejl eller noget?

Mvh
Avatar billede simsen Mester
07. marts 2007 - 18:36 #7
Fejlen den kommer med er:

System.InvalidCastException was unhandled by user code
  Message="Specified cast is not valid."
  Source="App_Web_jh9i2vsb"
  StackTrace:
      at ASP.kunder_aspx.__DataBinding__control40(Object sender, EventArgs e) in c:\Inetpub\wwwroot\Faktureringssystem\Kunder.aspx:line 473
      at System.Web.UI.Control.OnDataBinding(EventArgs e)
      at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding)
      at System.Web.UI.Control.DataBind()
      at System.Web.UI.Control.DataBindChildren()

Jeg gør følgende:

<asp:TemplateField>
                                                    <ItemTemplate>
                                                        <asp:CheckBox ID="cboxPayed" runat="server" Checked='<%# Bind("Betalt") %>' />
                                                    </ItemTemplate>
                                                    <HeaderStyle Width="267px" />
                                                    <ItemStyle HorizontalAlign="Center" />
                                                </asp:TemplateField>

Når jeg bruger følgende - er der ingen problemer - men som sagt - så er den også udfaded:

<asp:CheckBoxField DataField="Betalt" HeaderText="Betalt">
                                                    <HeaderStyle Width="60px" />
                                                    <ItemStyle HorizontalAlign="Center" />
                                                </asp:CheckBoxField>

Checker dine links ud her de næste dage :-)

mvh
simsen :-)
Avatar billede snepnet Nybegynder
08. marts 2007 - 13:25 #8
Hvilket type er feltet i databasen?
Mvh
Avatar billede simsen Mester
08. marts 2007 - 18:15 #9
Feltet er et Ja/Nej felt i Accessdatabasen.

Nu har jeg så fundet ud af, hvad du mener med object datasource, og denne måde kan(vil) jeg ikke bruge, da jeg så, hvis jeg ændrer i connectionsstring, skal ind og rette på alle sider.

Jeg har gjort det manuelt fra start i en seperat fil, jeg kalder, når jeg har brug for den. De to links jeg har fået af dig, bygger på object datasource metoden, og jeg kan ikke bruge dem desværre

mvh
simsen :-)
Avatar billede snepnet Nybegynder
08. marts 2007 - 23:38 #10
Æhh... er ikke helt med på hvad du mener?
Der er hverken med object datasource eller sql data source noget behov for at skrive connectionsstring på dine sider.
Med en objectdatasource tilgår du dine egne klasser, og der angiver du jo selv hvordan din connectionstring skal findes frem.
Lader du VS lave dig en sql datasource - lægger miljøet din connectionstring i web.config.

Her et ultrahurtigt og principielt eksempel på brug af en object data source:

<asp:GridView
    ID="grid"
    runat="server"
    AllowSorting="True"
    DataSourceID="ObjectDataSource1"
    OnSorting="GridView2_Sorting">
</asp:GridView>
<asp:ObjectDataSource
    ID="ods"
    runat="server"
    SelectMethod="GetData"
    TypeName="SomeNamespace.DataStuff">
</asp:ObjectDataSource>

Og klassen datastuff (liggende i namespacet SomeNamespace):

public class DataStuff
{
    public static DataTable GetData()
    {
        DataTable table = new DataTable();
        table.Columns.Add("Text", typeof(string));

        DataRow row = table.NewRow();
        row["Text"] = "hej";
        table.Rows.Add(row);

        row = table.NewRow();
        row["Text"] = "med";
        table.Rows.Add(row);

        row = table.NewRow();
        row["Text"] = "dig";
        table.Rows.Add(row);

        return table;
    }
}

Nu henter jeg så ikke noget fra en database - men det skulle gerne illustrere at du er væk fra din for med den klasse, og at du kan lave den som du har lyst til... Du kan naturligvis også returnere lister af egne typer ell.

Mvh
Avatar billede snepnet Nybegynder
08. marts 2007 - 23:40 #11
Var lige en lille misser - der skal self. peges på den datasource jeg har vist dig :o)

<asp:GridView
    ID="grid"
    runat="server"
    AllowSorting="True"
    DataSourceID="ods"
</asp:GridView>
<asp:ObjectDataSource
    ID="ods"
    runat="server"
    SelectMethod="GetData"
    TypeName="SomeNamespace.DataStuff">
</asp:ObjectDataSource>

Mvh
Avatar billede simsen Mester
14. marts 2007 - 19:39 #12
Jeg har opgivet at gøre det på den måde.....

Smid et svar snepnet og tak for hjælpen :-)

mvh
simsen
Avatar billede snepnet Nybegynder
15. marts 2007 - 15:42 #13
Det var så lidt ... Du kan godt få et mere komplet eksempel på et tidspunkt, hvis det skulle blive aktuelt igen.
Mvh
Avatar billede simsen Mester
16. marts 2007 - 18:57 #14
snepnet

Det vil jeg højst sansynligt gerne......

Og så mangler du at gøre det til et svar ;-)

mvh
simsen
Avatar billede snepnet Nybegynder
19. marts 2007 - 22:48 #15
Det gør jeg så nu :o)
Du må råbe op hvis du får brug for det.
Mvh
Avatar billede simsen Mester
21. marts 2007 - 11:15 #16
snepnet

Will do........
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