Avatar billede suppenudel Nybegynder
30. maj 2005 - 13:51 Der er 16 kommentarer og
1 løsning

DataGridCommandEventArgs - lille spørgsmål

Hej, jeg har lige læst lidt om dette emne inde på MSDN, men har lige et spørgsmål.

Jeg kan fint når jeg klikker på mine knapper i min ItemTemplate køre mine "slette" og "rette"-Subs, via:

OnDeleteCommand="slet"
OnEditCommand="ret"

Osv.

Men hvad hvis jeg gerne vil have en knap, der udfører en Sub som ikke nødvendigvis er "Delete", "Update" eller "Cancel".-relateret.

Kan jeg ikke bare lave en slags custom-button, og så skrive noget i stil med: OnMinCustomKnapCommand="MinSub"?
Avatar billede snepnet Nybegynder
30. maj 2005 - 13:57 #1
jo - du kan også opsamle ItemCommand, den vil køre hvis du lægger din egen knap ind.
du kan så sætte CommandName, og CommandArgument på knappen, så du i den generelle handler kan eksekvere kode afhængid af de to.

alternativt kan du deklarativt angive det i aspx-koden, at du ønsker en bestemt handler eksekveret.

mvh
Avatar billede suppenudel Nybegynder
30. maj 2005 - 14:11 #2
Okay - kan du give et lille eksempel, jeg forstår ikke helt den med at opsamle ItemCommand?

Lad os sige jeg lægger denne ind sammen med de andre:

<asp:Button CommandName="Nulstil" runat="server" Text="Nulstil" />
Avatar billede snepnet Nybegynder
30. maj 2005 - 14:21 #3
så kan du enten vælge at gøre sådan her :

<asp:Button CommandName="Nulstil" runat="server" Text="Nulstil" OnClick="Nulstil_Click" />

og så i koden :
protected void Nulstil_Click(object sender, EventArgs e)
{
  // ... kode her
}

dette er en god mulighed hvis altid indsætter et par ekstra knapper med helt specielt funktionalitet.

men... du kan også gør sådan her :

abbonnere på ItemCommand ved :
someDataGrid.ItemCommand += DataGridCommandEventHandler(this.Grid_ItemCommand);

eller sådan her :
<asp:DataGrid id="Grid" runat="server" OnItemCommand="Grid_ItemCommand">

og så have en handler i koden sådan her :

private void Grid_ItemCommand(object source, DataGridCommandEventArgs e)
{
}

det sidste kunne måske være en fordel hvis du sætter flere forskellige knapper ind dynamisk, og du vil i den situation kunne drage nytte af at sætte et par properties på dine knapper, nemlig :

.CommandName
og
.CommandArgument

som du så kan udnytte i koden til at vælge hvad der skal gøres når der klikkes.

hvis det virkede lidt tåget må du lige sige til ... så skal jeg se om jeg kan forklare det bedre.

mvh
Avatar billede suppenudel Nybegynder
30. maj 2005 - 21:51 #4
Hej Snepnet - tak for de fine forslag! :-)

Jeg har dog lidt problemer med dem. Den første forstår jeg godt, men når jeg prøver at implementere den, giver den mig en fejlmeddelelse, fordi jeg i min Sub Nulstil_click, kører noget:
...

Dim LevIdColumn as TableCell = e.Item.Cells(0)

...

Hvorden så siger:

'Item' is not a member of 'System.EventArgs'.

3. Forslag er jeg ikke helt med på, for hvis jeg i mit grid har:

<asp:DataGrid id="Grid" runat="server" OnItemCommand="Grid_ItemCommand">

Hvad er så "OnItemCommand"? - Er det min knap, som jeg skal have defineret længere nede?

I'm sorry, er næsten med, ikke helt :-)
Avatar billede snepnet Nybegynder
30. maj 2005 - 23:07 #5
du kan ikke trække dit item ud af et System.EventArgs, så det skal du have en fejl på (hvad er årsagen til at du prøver at få fat i dit item ?)
OnItemCommand er bare det det hedder når du deklarativt ønsker at pege på en eventhandler for et generisk itemcommand (en ikke nærmere specificeret kommando, men dog en hændelse i et item).

mvh
Avatar billede snepnet Nybegynder
30. maj 2005 - 23:12 #6
men bortset fra det .... så burde du da have et DataGridCommandEventArgs at arbejde med, og ikke bare et EventArgs, og det burde du uden problemer kunne få dit item fra ?!?
må jeg se din kode en gang ?
mvh
Avatar billede suppenudel Nybegynder
30. maj 2005 - 23:36 #7
Hej, ja du kan jo lige se, det er den her sub jeg prøver at hente - her forsøgt med din Reset_Click:

    Sub Reset_Click(sender As Object, e As EventArgs)
      'sub Reset(sender as object, e as datagridcommandeventargs)
          try
              Dim BrIdColumn as TableCell = e.Item.Cells(0)
              Dim BrIdColText as String = BrIdColumn.Text
              dim BrId as string
              BrId = BrIdColumn.Text
   
                  open("database.mdb")
                   
                    strSQL = "UPDATE Brugere SET Brugere.point = 0 WHERE BrId=" & BrId & ";"
                 
                  writedata(strSQL)
             
              closedb("database.mdb")
          catch t as exception
          end try
          Fill_dg()
      end sub
Avatar billede snepnet Nybegynder
30. maj 2005 - 23:47 #8
ah... hvis du laver det sådan (altså det er som det første eksempel ikke ?) - så kan du kun samle et EventArgs op, som du så ikke kan hente et item på.
... du kan dog få dit item via sender, men det er lidt gnidret.
du skal caste din sender og kigge på dennes NamingContainer, hvilket givetvis er en TableCell, men dennes NamingContainer er så nok dit DataGridItem.
altså noget i denne stil :
DataGridItem item = (DataGridItem)((Control)sender).NamingContiner.NamingContainer;

eller kan du som sagt sætte nogle paramtre på dine knapper, som du så kan bruge i handleren - f.eks. et itemindex.

mvh
Avatar billede suppenudel Nybegynder
31. maj 2005 - 00:22 #9
Jo, men det jeg gør nu, er at jeg fint kan få det til at virke med:

<asp:datagrid id="dg" runat="server" OnpageIndexChanged="SideSkift_dg" PageSize="5" AllowPaging="True" GridLines="Vertical" CssClass="GridOmkreds" OnSortCommand="Gridsorter_dg" AllowSorting="True" AutoGenerateColumns="False" OnUpdateCommand="Nulstil">

Og med min UpdateCommand-button i bunden i min ItemTemplate:

<asp:Button CommandName="Nulstil" runat="server" Text="Nulstil" />

Og når jeg klikker den, kører den fint Sub'en:

sub Reset(sender as object, e as datagridcommandeventargs)

Men hvorfor har man kun "Delete", "Update" eller "Cancel"-Commands at gøre godt med?
Hvis jeg nu bare kunne lave en knap der hedder "Id-Reset" i min ItemTemplate, og som så kalder på Sub'en oppe i DataGrid'ets OnResetCommand="Nulstil"> 

Jeg er måske helt på bar bund? :-)
Avatar billede snepnet Nybegynder
31. maj 2005 - 00:59 #10
ved ikke om man kan sige at du er på bar bund :o)
men... nu kommer griddet med "indbyggede" muligheder for håndtering af nogle få specifikke kommandoer, og hvis du har brug for flere må du tilføje dem selv.
dem du selv nævner går under alle omstændigheder igennem ItemCommand alligevel (du kan prøve at debugge det - så kan du se hvad jeg mener).
desuden betyder det vel ikke så meget hvor du skriver det i din template... om det er noget du skriver på griddet eller på knappen - eller ?!?

skal du håndtere det på "grid-niveau" - skal du som sagt abbonnere på ItemCommand, og sørge for at du kan kende knaptrykkende fra hinanden (typisk ved at tilføje et CommandName på knappen, som du så udleder i ItemCommand-handlere) ved f.eks.:

Button btn = (Button)sender;
switch(btn.CommandName)
{
  case "RESET" :
    ResetGrid();
    break;
...
..
.
}

det er som sagt ca. sådan de andre muligheder er implementeret i forvejen, så den skulle være gangbar :o)

mvh
Avatar billede suppenudel Nybegynder
31. maj 2005 - 16:07 #11
okay - havde det næsten til at virke. Jeg har: OnItemCommand="Nulstil_bruger" i mit grid.

Hvordan teldeler jeg denne et navn, således at den er kædet sammen med min button i template'en, hvor jeg har CommandName="Reset"
Avatar billede snepnet Nybegynder
31. maj 2005 - 18:18 #12
jeg er ikke sikker på at jeg helt forstår hvad du spørger om.... hvis du gerne vil have "navn på knappen" kan du sætte CommandArgument til navnet (kan du gøre ved alm. databinding hvis du vil).
... sig lige til hvis jeg misforstod.
mvh
Avatar billede suppenudel Nybegynder
07. juni 2005 - 10:40 #13
Hej Snep, sorry, har lige været et par dage.

Jeg har lige lavet et eksempel på hvad jeg mener herunder:

<%@ Page Language="VB" %>
<script runat="server">

      Sub Page_Load(Source As Object, E as EventArgs)
        If not Page.IspostBack then
        fill_dg
        end if
      End Sub
   
          fill_dg()
   
      Sub Update_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved standard update-button i dg
      end sub
   
      sub Ret_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved reset-button i dg
      end sub
   
      sub Slet_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved reset-button i dg
      end sub
   
      sub Reset_bruger(sender as object, e as datagridcommandeventargs)
        '*** kode der eksekveres ved min egen definerede reset-button i dg ****
      end sub

</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
  </head>
<body>
    <form runat="server">
        <table cellpadding="0" width="100%">
            <tbody>
                <tr>
                    <td>
                    </td>
                </tr>
                <tr>
                    <td>
                        <table>
                            <tbody>
                                <tr>
                                    <td>
                                    </td>
                                    <td>                                   
                                        <asp:datagrid id="dgleverandor" runat="server" OnEditCommand="Ret_bruger" Width="95%" OnUpdateCommand="update_bruger" OnDeleteCommand="slet_bruger" OnRESETCommand="RESET_BBRUGER">                                                                                   
                                            <Columns>
                                                <asp:TemplateColumn>
                                                    <HeaderStyle horizontalalign="Center" verticalalign="Top"></HeaderStyle>
                                                    <ItemTemplate>
                                                        <asp:Button CommandName="Update" runat="server" Text="Opdater" />
                                                        <asp:Button CommandName="Delete" runat="server" Text="Slet" />
                                                        <asp:Button CommandName="Edit" runat="server" Text="Ret" />
                                                        <asp:Button CommandName="RESET" runat="server" Text="Nulstil" />
                                                    </ItemTemplate>
                                                </asp:TemplateColumn>
                                            </Columns>
                                        </asp:datagrid>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>

- Håber du kan se hvad jeg mener :-)

Vil bar have min egen "reset"-button til at virke, så den henter "Sub Reset_bruger"
Avatar billede suppenudel Nybegynder
07. juni 2005 - 10:41 #14
RETTELSE:
Avatar billede suppenudel Nybegynder
07. juni 2005 - 10:42 #15
<%@ Page Language="VB" %>
<script runat="server">

      Sub Page_Load(Source As Object, E as EventArgs)
        If not Page.IspostBack then
        fill_dg
        end if
      End Sub
   
          fill_dg()
   
      Sub Update_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved standard update-button i dg
      end sub
   
      sub Ret_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved standard edit-button i dg
      end sub
   
      sub Slet_bruger(sender as object, e as datagridcommandeventargs)
        'kode der eksekveres ved standard delete-button i dg
      end sub
   
      sub Reset_bruger(sender as object, e as datagridcommandeventargs)
        '*** kode der eksekveres ved min egen definerede reset-button i dg ****
      end sub

</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
  </head>
<body>
    <form runat="server">
        <table cellpadding="0" width="100%">
            <tbody>
                <tr>
                    <td>
                    </td>
                </tr>
                <tr>
                    <td>
                        <table>
                            <tbody>
                                <tr>
                                    <td>
                                    </td>
                                    <td>                                   
                                        <asp:datagrid id="dgleverandor" runat="server" OnEditCommand="Ret_bruger" Width="95%" OnUpdateCommand="update_bruger" OnDeleteCommand="slet_bruger" OnRESETCommand="RESET_BBRUGER">                                                                                   
                                            <Columns>
                                                <asp:TemplateColumn>
                                                    <HeaderStyle horizontalalign="Center" verticalalign="Top"></HeaderStyle>
                                                    <ItemTemplate>
                                                        <asp:Button CommandName="Update" runat="server" Text="Opdater" />
                                                        <asp:Button CommandName="Delete" runat="server" Text="Slet" />
                                                        <asp:Button CommandName="Edit" runat="server" Text="Ret" />
                                                        <asp:Button CommandName="RESET" runat="server" Text="Nulstil" />
                                                    </ItemTemplate>
                                                </asp:TemplateColumn>
                                            </Columns>
                                        </asp:datagrid>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </td>
                </tr>
            </tbody>
        </table>
    </form>
</body>
</html>
Avatar billede suppenudel Nybegynder
14. juni 2005 - 03:16 #16
Ærgeligt. Ikke rigtig noget nyt, så lukker af. - Ellers tak for hjælpen!
Avatar billede suppenudel Nybegynder
14. juni 2005 - 03:17 #17
-
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