Avatar billede misbruger Nybegynder
15. maj 2003 - 20:10 Der er 14 kommentarer og
1 løsning

Skriv til control i datagrid

Mit grid...

<asp:DataGrid
    id="dtgSites"
    runat="server"
    AutoGenerateColumns="False"
    datakeyfield="Indeks"
    OnItemCommand="ShowDetails">

  <columns>
    <asp:boundcolumn datafield="Indeks" headertext="Indeks" readonly="True"/">
    <asp:templatecolumn headertext="blabla">
      <itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Name") %>
      </itemtemplate>
      <edititemtemplate>
        <asp:Label id=lblName runat=server/>
        <asp:TextBox id=txtName runat=server text='<%# DataBinder.Eval(Container.DataItem, "Name") %>'/>
      </edititemtemplate>
    </asp:templatecolumn>
    <asp:ButtonColumn ButtonType="LinkButton" HeaderText="Details" Text="Show"></asp:ButtonColumn>
  </columns>
</asp:DataGrid>


Min methode (der svare på OnItemCommand)...

protected void ShowDetails(Object sender, DataGridCommandEventArgs E)
{
  dtgSites.EditItemIndex = (int)E.Item.ItemIndex;
  BindGrid();
  ((Label)E.Item.FindControl("lblName")).Text = "dada";
}

I mit edititemtemplate, har jeg en Label: "lblName"
Jeg vil meget gerne skrive til den label når EditItemIndex bliver sat, men jeg kan ikke fange controllen...?

Denne sætning virker ikke...

((Label)E.Item.FindControl("lblName")).Text = "dada"

Hvad gør jeg galt.....???
Avatar billede odegaard Nybegynder
15. maj 2003 - 20:41 #1
Når du siger at det ikke virker, sker der så ikke noget, eller får du en fejl ?
Avatar billede odegaard Nybegynder
15. maj 2003 - 20:45 #2
Prøv at kalde BindGrid() efter at du har ændret din label. Sådan gøres der ihvertfald i et eksempel i SDK'en.
Avatar billede thrytter Nybegynder
16. maj 2003 - 00:56 #3
Du kan fange kontrollen i DataGrid_ItemDataBound (VB), efter kald af BindGrid.

Prøv at omforme følgende VB kode til c# - skal indsættes i DataGrid_ItemDataBound

  Select Case e.Item.ItemType
    Case ListItemType.EditItem
      CType(e.Item.Cells(0).FindControl("lblName"), Label).Text = "dada"
  End Select
Avatar billede odegaard Nybegynder
16. maj 2003 - 09:55 #4
thrytter: Det vanvittige smarte ved at gøre det i det ud fra DataGridCommandEventArgs, er jo netop at du hér har fat i netop den række som der skal ændres. Ved ItemDataBound skal du sidde og tjekke for at du hvilken række du har, hvilket vil indebære at du skal bruge globale varialble for at overføre række-ID'et.
Misbruger: Hvis du bruger viewstate (default), så burde det egentlig ikke være nødvendigt med en ny bindgrid.
Når jeg ændrer data
Avatar billede odegaard Nybegynder
16. maj 2003 - 09:56 #5
hovsa... se bort fra den sidste linje :-)
Avatar billede misbruger Nybegynder
16. maj 2003 - 10:14 #6
Fejl...

System.NullReferenceException: Object reference not set to an instance of an object

I linien...

((Label)E.Item.FindControl("lblName")).Text = "dada";

odegaard -> Jeg bruger viewstate

Jeg kan ikke forstå hvorfor jeg ikke kan fange controllen!
Avatar billede odegaard Nybegynder
16. maj 2003 - 10:25 #7
Prøv lige først at tjekke om du i det hele taget finder en kontrol:
Label myLabel = (Label)E.Item.FindControl("lblName");
if(myLabel!=null) { ... }
else{ ... }

Det dumme spørgsmål: findes der en LABEL der kedder lblName ?
Avatar billede misbruger Nybegynder
16. maj 2003 - 10:41 #8
Nej jeg finder ikke label'en hvis jeg prøver som du forslå....

Ja label'en findes :)

Jeg har prøvet at loope mig igennem alle controls på siden, og der finder jeg... "dtgSites__ctl4_lblName"
Avatar billede misbruger Nybegynder
16. maj 2003 - 10:48 #9
Har du noget sinde mødt denne fejl før...

Http fejl:
Server Application Unavailable
The web application you are attempting to access on this web server is currently unavailable.  Please hit the "Refresh" button in your web browser to retry your request.

Administrator Note: An error message detailing the cause of this specific request failure can be found in the application event log of the web server. Please review this log entry to discover what caused this error to occur.

Event log:
aspnet_wp.exe  (PID: 2952) stopped unexpectedly.

???
Avatar billede odegaard Nybegynder
16. maj 2003 - 10:52 #10
ja det er når du beder om en side og asp.net servicen er ved at genstarte (f.ekx. hvis du lige har ændret i web.config el. global.asax)
Avatar billede misbruger Nybegynder
16. maj 2003 - 10:54 #11
...løst efter ganstart af webservicen!
Avatar billede thrytter Nybegynder
16. maj 2003 - 11:43 #12
odegaard: Kan også selv lide smarte ting, men allerbedst noget som fungerer...

Fejlen opstår da der bruges en kontrol (label) i EditItemTemplate men ikke i ItemTemplate. Parameteren DataGridCommandEventArgs i funktionen ShowDetails ændres desværre ikke efter kald af BindGrid(), og derfor fejler funktionen:

  (Label)E.Item.FindControl("lblName")).Text = "dada";

Parameteren refererer stadig til en række i griddet som ikke er sat i EditMode, og derfor ikke indeholder en label....
Avatar billede misbruger Nybegynder
16. maj 2003 - 16:36 #13
Men jeg kan godt fange TextBoxen i min EditItemTemplate....?

  <asp:templatecolumn headertext="blabla">
      <itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Name") %>
      </itemtemplate>
      <edititemtemplate>
        <asp:Label id=lblName runat=server/>
        <asp:TextBox id=txtName runat=server text='<%# DataBinder.Eval(Container.DataItem, "Name") %>'/>
      </edititemtemplate>
    </asp:templatecolumn>

string _Name = ((TextBox)E.Item.FindControl("txtName")).Text;

Hvorfor kan jeg fange min TextBox, men ikke min label...???
Avatar billede thrytter Nybegynder
16. maj 2003 - 18:25 #14
Lyder mærkeligt, at du kan fange din TextBox i funktionen ShowDetails() men ikke din Label!

Jeg foretrækker nu løsningen med OnItemDataBound, men alternativt kan kontrollerne fanges i din ShowDetails funktion ved indsættelse af følgende kode efter BindGrid();

Dim iEditIndex As Integer = e.Item.ItemIndex

CType(Me.DataGrid1.Items(iEditIndex).FindControl("lblName"), Label).Text = "LABEL"

CType(Me.DataGrid1.Items(iEditIndex).FindControl("txtName"), TextBox).Text = "TEXTBOX"

Virker på begge måder i VB.
Avatar billede misbruger Nybegynder
16. maj 2003 - 20:56 #15
tja... nu er jeg gået bort fra min oprindelige idee med at næste controller i EditItemTemplate...

Min oprindelige ide var at indbygge adskellige grids og andre controller i min EditItemTemplate, men bare i dette lille test forsøg har jeg haft for mange probs., og denne løsninge er rapid application development, så jeg har ikke mere tid til at ekspementere...

thrytter....jeg vil prøve din løsning en dag hvor jeg har bedre tid, tak for hjælpen!
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