Avatar billede anhansen Nybegynder
23. august 2004 - 09:13 Der er 43 kommentarer og
1 løsning

Focus i datagrid?

Hej,

Er der nogen der har en ide til en kodestump - som gør at når man trykker "ret" (editcommand) i et datagrid - så skal den første textbox i den række man vil rette i have fokus.

Alternativt, bare få fat i clientID på textboxen - så kan det gøres via javascript.
Avatar billede snepnet Nybegynder
23. august 2004 - 09:40 #1
hvis du har en tekstboks som første kontrol i første celle kan du få fat i den med
TextBox tb = (TextBox)e.Item.Cell[0].Controls[0];
og hente ids med
tb.ClientId / tb.ID / tb.UniqueID
Avatar billede snepnet Nybegynder
23. august 2004 - 09:42 #2
hov.. der er vist lige et par stavefejl der :o)
TextBox tb = (TextBox)e.Item.Cells[0].Controls[0];
og hente ids med
tb.ClientID / tb.ID / tb.UniqueID
Avatar billede anhansen Nybegynder
23. august 2004 - 09:45 #3
ok... Så det er bare med at prøve lidt frem... :-) Den er nok som 1. i 7. celle... Men det er jo bare cell[6] så.. :-)

Jeg prøver lige..
Avatar billede snepnet Nybegynder
23. august 2004 - 09:47 #4
hvis du har givet dem id´selv... altså hvis du har skrevet en template i aspx-filen, kan du finde den med :
TextBox tb = (TextBox)e.Item.FindControl(<kontrol id som skrevet i din template>);
Avatar billede anhansen Nybegynder
23. august 2004 - 09:57 #5
er der en måde hvorpå jeg kan finde ud af præcis hvor textbox'en ligger.
Den ligger i 13. celle - men nogle af cellerne er ikke visible.
Men hvis jeg prøver med Cells[12].Controls[0] får jeg et invalid cast.
Avatar billede anhansen Nybegynder
23. august 2004 - 09:58 #6
ok... det vil sige:
<EditItemTemplate>
                                            <asp:textbox CssClass="select" id="MaterialComments" MaxLength="250" runat="server" Text='<%# (string)DataBinder.Eval(Container.DataItem, "MaterialComments") %>' Width=75px>
                                            </asp:textbox>
                                        </EditItemTemplate>

Giver :
e.Item.FindControl("MaterialComments");
Avatar billede snepnet Nybegynder
23. august 2004 - 10:00 #7
jeps
Avatar billede anhansen Nybegynder
23. august 2004 - 10:01 #8
TextBox tb = (TextBox)e.Item.FindControl("MaterialComments");
Response.Write(tb.ClientID);

giver null fejl på tb?
Object reference not set to an instance of an object.

Hvad kan det skyldes?
Avatar billede snepnet Nybegynder
23. august 2004 - 10:02 #9
men du skal ikke regne med at du har tekstboksene før du databinder.
Avatar billede anhansen Nybegynder
23. august 2004 - 10:04 #10
ok... Så det vil sige at jeg ikke kan gøre det i _editCommand?

Men det er jo kun i den jeg har fat i den linie. Så forstår jeg ikke helt hvordan jeg skal komme frem til det..
Avatar billede anhansen Nybegynder
23. august 2004 - 10:06 #11
Kan jeg gemme (TextBox)e.Item.FindControl("MaterialComments");
i en global variabel på siden - og så regne med at den er blevet instantieret senere?
Avatar billede snepnet Nybegynder
23. august 2004 - 10:06 #12
du kan gøre det i enten ItemDataBound, eller ItemCreated sådan her f.eks. :

private void Dg_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
    if(e.Item.ItemIndex == Dg.EditItemIndex && e.Item.ItemIndex != -1)
    {
        TextBox tb = (TextBox)e.Item.Cells[2].Controls[0];
    }
}

private void Dg_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
    if(e.Item.ItemIndex == Dg.EditItemIndex && e.Item.ItemIndex != -1)
    {
        TextBox tb = (TextBox)e.Item.Cells[2].Controls[0];
    }       
}
Avatar billede anhansen Nybegynder
23. august 2004 - 10:08 #13
ok... God ide... Det prøver jeg lige...
Avatar billede snepnet Nybegynder
23. august 2004 - 10:09 #14
datagriddet bruger din edititemtemplate hvis edititemindex svare til det aktuelle rækkeindex, men det er så nødvendigt at rækken bliver skabt før du kan få fat i tekstboksen.
men når man sætter et nyt EditItemIndex vil man vanligvis databinde efterfølgende... det er derfor du også kan bruge ItemDataBound.
(jeg ville dog nok selv vælge ItemCreated).
Avatar billede anhansen Nybegynder
23. august 2004 - 10:10 #15
haha... Du er en gud.. :-)

Tak for hjælpen.. Og så har jeg lært endnu en ting i dag... dg.EditItemIndex... :-) Og at den er -1 hvis der ikke bliver rettet...

Smid et svar - så er der points.
Avatar billede snepnet Nybegynder
23. august 2004 - 10:11 #16
svar :o)
Avatar billede anhansen Nybegynder
23. august 2004 - 10:12 #17
ok.. Hvorfor ville du vælge created frem for databound?
Det forstår jeg ikke helt? er created efter databound - sejler altid rundt i den rækkefølge...
Avatar billede snepnet Nybegynder
23. august 2004 - 10:16 #18
Created først... Databinding er et system for sig, så jeg ville vælge created da det på en eller anden måde giver mere mening at man tilføjer noget noget til produktionen af en række, fremfor til databindingen.
men jeg har også meget svært ved at få øje på et scenarie, hvor du ikke vil kunne gøre det i ItemDataBound :o)
Avatar billede anhansen Nybegynder
23. august 2004 - 10:32 #19
ja... det har du nok ret i... Det har jo ikke nødvendigvis så meget at gøre med hvad der står i textfeltet...
Men det ser ud til at virke.. Nu skal jeg bare have gjort så der er focus i textboxen når men retter...
Det er fordi jeg har et problem med at den starter fra toppen af listen selv om man har scrollet ned og så valgt at rette en post "udenfor" det oprindelige skærmbillede..
Men tak for hjælpen... :-)
Avatar billede anhansen Nybegynder
23. august 2004 - 10:44 #20
Lige et sidste spørgsmål... Så skal du nok få 15-20 ekstra points..
Kan man også finde id fra update "knappen". Er en linkbutton.
Således at jeg kan lave en javascript der ved tryk på enter i denne textbox - udfører click() på gem? Lige nu når man trykker enter tager den nemlig som default første knap på siden - som tilfældigvis er logud... :-)
Avatar billede snepnet Nybegynder
23. august 2004 - 10:59 #21
haha... ja det er jo lidt uheldigt :o) - bedst som man tror man redigerer lidt lækkert bliver man kylet ud :oD

Ja det kan du godt, men det er nok en lille smule mere gnidret.

Du kan gøre det ligesom før... hvis du f.eks. har "knap-kolonnen" længst til venstre :

LinkButton btnUpdate = (LinkButton)e.Item.Cells[0].Controls[0];

Den vil altid ligge som Controls[0] i den respektive celle.
(du kan eventuelt kontrollere med den tekst du har sat på knappen)
altså)

if(btnUpdate.Text == "<hvilken tekst du nu har valgt>")
  // ...

Jeg er ikke sikker på at der ikke eksisterer smartere måde at gøre det på, men jeg tror det ikke.

Jeg tror ikke du har mulighed for at sætte et id på knappen i din template, og hvis du skal tilskrive et id til knappen programmatisk skal du alligevel selv prøve at find den ved ovenstående.

Alternativt kan du jo gå bort fra "standardknap kolonnen", og lave din egen.

Mvh
Avatar billede anhansen Nybegynder
23. august 2004 - 12:45 #22
fuld af gode ideer er du... Jeg prøver det først lige lidt senere i dag.. Men skal nok vende tilbage... Der er lige kommet en hasteopgave på tværs.
Avatar billede snepnet Nybegynder
23. august 2004 - 12:49 #23
:o) - det er bare iorden... du skriver bare hvis der er mere.
mvh
Avatar billede anhansen Nybegynder
23. august 2004 - 14:21 #24
Nu kan det godt være det er mig der kegler rundt... Men jeg kan ikke få den til at typecaste til Linkbutton. Hvis jeg laver en tostring() på den celle jeg mener den er i .controls[0] så skriver den at det er en literalControl...

Er det fordi jeg tager fejl af cellerne - eller er det noget andet? Kan du gennemskue det?
Avatar billede anhansen Nybegynder
23. august 2004 - 14:26 #25
Er det fordi .net slet ikke laver en linkbutton - men bare skriver html teksten - med javascript onclick funktion.

Det kan ikke have noget at gøre med om jeg gør det i OnCreated eller OnDatabound.
For så har vi jo en grund her... hehe
Avatar billede snepnet Nybegynder
23. august 2004 - 14:26 #26
Virker det her ikke hvis du har dine linkbuttons i celle 1 (0) ?
LinkButton btnUpdate = (LinkButton)e.Item.Cells[0].Controls[0];
Avatar billede snepnet Nybegynder
23. august 2004 - 14:30 #27
Prøve lige.... jeg har ikke nogen problemer med det her :
private void Dg_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
    if(e.Item.ItemIndex == Dg.EditItemIndex && e.Item.ItemIndex != -1)
    {
        LinkButton btnUpdate = (LinkButton)e.Item.Cells[0].Controls[0];
    }       
}
Avatar billede snepnet Nybegynder
23. august 2004 - 14:31 #28
("prøvede lige" var det jeg prøvede at skrive :o)
Avatar billede anhansen Nybegynder
23. august 2004 - 14:32 #29
hmm... så må det være fordi jeg er ved det forkerte index... Cells - den tæller alle rækker, også invisible, startende fra 0 - ikke?
Jeg prøver at løbe igennem dem og se om jeg kan finde en linkbutton et sted... :-)
Avatar billede snepnet Nybegynder
23. august 2004 - 14:34 #30
hvis du debugger kan du i eventhandleren prøve at markere e.Item.Cells, og holde shift nede mens du trykker F9
(hvis du bruger visual studio ;o)
Avatar billede anhansen Nybegynder
23. august 2004 - 14:51 #31
Hmm... så fik jeg fanget den... Nu er næste spørgsmål så... Hvordan får jeg klicket på den... Den er jo ikke en button - så jeg kan ikke "javascript" click() den.

Jeg kan kalde __doPostBack men der er clientId ikke det rigtige - det er med __ istedet for :_

Kan man hive den med :_ direkte ud, eller skal jeg bare lave en replace..
Avatar billede anhansen Nybegynder
23. august 2004 - 14:52 #32
fra mine java dage er jeg vant til at skrive ting ud hvis jeg skal vide noget om dem... Den gode gamle manuelle debug.. hehe
Avatar billede anhansen Nybegynder
23. august 2004 - 14:54 #33
Nu tror jeg det virker... Brugte replace...

Jeg laver lige et nyt sprgsml med points... Hvor mange skal vi sige... Er 60 fint?
Avatar billede snepnet Nybegynder
23. august 2004 - 14:58 #34
private void Dg_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
    if(e.Item.ItemIndex == Dg.EditItemIndex && e.Item.ItemIndex != -1)
    {
        TextBox tb = (TextBox)e.Item.Cells[2].Controls[0];
        LinkButton btnUpdate = (LinkButton)e.Item.Cells[0].Controls[0];
        btnUpdate.Attributes.Add("onclick","alert('test');");
    }       
}

hvis du istedet for nedenstående alert

btnUpdate.Attributes.Add("onclick","alert('test');");

kalder en metode kan du på returværdien fra metoden bestemme om der skal laves et postback eller ej.

btnUpdate.Attributes.Add("onclick","return false;");

Vil f.eks. sikre at du ikke kan lave et postback på den (ikke ret brugbart... men et eksempel :o)
Avatar billede anhansen Nybegynder
23. august 2004 - 15:07 #35
ja.

Jeg har et script - som fanger tastetryk. Når den nedtrykkede tast er enter - så går scriptet et eller andet. Normalt har jeg en alm. button således scriptet siger : btn.click();
Men det kan jeg ikke med LinkButton - da den clientside kun er en a href. Derfor simulerer jeg nu blot denne ved at lade mit script kalde __doPostBack('ctrl','');

Så virker det - ihvertfald i IE. Har lidt problemer med at få scripts til at virke i mozilla - men det er noget med noget javascript sikkerhed tror jeg...

Men .net's postback javascript virker da..
Avatar billede snepnet Nybegynder
23. august 2004 - 15:18 #36
ahh... der er metoder til den slags :
GetPostBackEventReference(Control control)
Avatar billede snepnet Nybegynder
23. august 2004 - 15:18 #37
og et overload hvor du kan angive et argument også.
Avatar billede anhansen Nybegynder
23. august 2004 - 15:26 #38
hehe... tænkte det nok... Man bliver klogere for hver dag...
Avatar billede anhansen Nybegynder
23. august 2004 - 15:38 #39
ja... det virker som sagt fint på mac... Har du nogen ide til hvorfor mine javascripts ikke virker på Mac/ mozilla.
Er det pga noget med hvordan form / form[] bliver brugt bare?
Jeg synes ikke jeg får nogle scripts fejl på mozilla.
Avatar billede snepnet Nybegynder
23. august 2004 - 15:42 #40
huh.... jeg er ikke lige nogen superhelt til crossbrowser scripting og den slags.
du skal nok have fat i en som roenving, eller en anden scriptguru.
Avatar billede anhansen Nybegynder
23. august 2004 - 15:45 #41
ok... laver en tråd om det i morgen... hehe...

men tak for hjælpen...  Nu har jeg vist snart programmeret nok for i dag...

Skal du have flere points?
Avatar billede snepnet Nybegynder
23. august 2004 - 15:51 #42
det var så lidt... det med point står du helt selv for :o)
Avatar billede anhansen Nybegynder
23. august 2004 - 16:12 #43
der ligger en tråd - points til snepnet.. ;-)

tak for hjælpen...
Avatar billede snepnet Nybegynder
23. august 2004 - 16:28 #44
Det var meget venligt... mange tak :o)
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