Avatar billede herchin Nybegynder
23. juli 2002 - 11:28 Der er 14 kommentarer og
3 løsninger

DataGrid event - selectedRow

Spørgsmål 1:
Hvordan fanger man, at brugeren klikker et row i et datagrid?

Min problemstilling er, at jeg gerne vil et datagrid med nogle oversiktsoplysninger for personer i hvert row, hvor det er mugligt, at klikke på et row og få præsenteret et nyt vindue med detailoplysninger.

***********
Spørgmål 2:
Når man klikker på et row, er det kun den celle, der klikkes på, som får fokus. Er det ikke muligt, at det er hele rowet, der markeres istedet? (På samme måde, som hvis man klikker i venstre side af et et row på den lille sorte pil...)
Avatar billede dgivoni Nybegynder
23. juli 2002 - 11:48 #1
Først spørgsmål 2:
Jeg ved ikke helt om det er det du vil, men med følgende eksempel kan du i hvert fald style hele rækken f.eks. ved mouseover.

Du skal have fat i OnItemDataBound-eventen på datagridden:
OnItemDataBound="Grid_OnItemDataBound"

som så kalder en funktion, der styler hele linjen:
protected void Grid_OnItemDataBound(Object sender, DataGridItemEventArgs e)
{
    // Get the newly created item
    ListItemType itemType = e.Item.ItemType;

    if ((itemType == ListItemType.Item)||(itemType == ListItemType.AlternatingItem))
    {
        e.Item.Attributes.Add("OnMouseOver", "this.style.backgroundColor='white';");
        e.Item.Attributes.Add("OnMouseOut", "this.style.backgroundColor='EEEEEE';");
        e.Item.Attributes.Add("style", "CURSOR:hand");
        e.Item.Attributes.Add("OnClick", "location = 'xxx.aspx';");
    }
}
Avatar billede dgivoni Nybegynder
23. juli 2002 - 11:49 #2
egentlig var det vist samtidig svaret på spørgsmål 1, da du kan sætte onclick attributten til at åbne et nyt vindue
Avatar billede nico26 Nybegynder
23. juli 2002 - 13:18 #3
man kan ikke bare gøre sådan OnItemDataBound="Grid_OnItemDataBound"

i formens constructor gør du noget lignende

  dg = new DataGrid();
  dg.Parent = this;
  dg.SetBounds(2, 2, 300, 300);
  dg.Click += new EventHandler(DGClick);


så kan du lave en event handler der kaldes når man klikker på gridet

private void DGClick(Object Source, EventArgs e) {
  int row = dg.CurrentRowIndex;
  ...
}
Avatar billede herchin Nybegynder
23. juli 2002 - 13:24 #4
Jeg skulle måske lige have tilføjet, at det er window forms. Sorry!

Jeg har lavet noget i asp.net, hvor jeg kunne bruge propertien .SelectedIndex på mit grid, men det lader ikke til findes når man bruger window forms... Det virkede umiddelbart mere enkelt end det du har skrevet oven over.
Avatar billede herchin Nybegynder
23. juli 2002 - 13:46 #5
Noco22 -> Vi kom på sporet her!
Jeg har lige kort lavet nedenstående kode. Der sker nu ikke så meget, for eventet reagerer ikke på det klik, der sker på de enkelte celler.

Pointen er, at selvom man klikker på en celle i et row, så er det hele rowet, der skal selectes og ikke kun cellen.

Nedenstående kode for eventet CurrentCellChanged minder meget om det jeg gerne vil have. Problemet er bare, at den celle, der bliver klikket på markeres med skygger og alt muligt. Desuden står markøren og blinker i cellen...

private void dg_CurrentCellChanged(object sender, System.EventArgs e)
{
    int rowIndex = dg.CurrentRowIndex;
    dg.Select(rowIndex);
    lblTest.Text = rowIndex.ToString();
}
Avatar billede nico26 Nybegynder
23. juli 2002 - 13:51 #6
Har du kikket i dokumentationen, om der en eller anden property man kan sætte.
Avatar billede dgivoni Nybegynder
23. juli 2002 - 13:53 #7
herchin >> sorry, men jeg har kun arbejdet med webforms.

nico22 >> selvfølgelig kan man gøre som jeg skrev. Jeg har selv implementeret det og det virker fint!
Avatar billede nico26 Nybegynder
23. juli 2002 - 13:53 #8
Prøv at sætte ReadOnly til true - så burde du slippe for at cursoren blinker i cellen
Avatar billede nico26 Nybegynder
23. juli 2002 - 14:00 #9
gdivoni>>Det var denne her linie jeg mente OnItemDataBound="Grid_OnItemDataBound"
Avatar billede dgivoni Nybegynder
23. juli 2002 - 14:01 #10
nico22>> den skal sættes ind som attribut på datagridden, det virker fint, men måske skrev jeg det ikke klart nok?
Avatar billede herchin Nybegynder
23. juli 2002 - 14:18 #11
Jeg har kigget og kigget, men der er meget at kigge på...
Avatar billede herchin Nybegynder
23. juli 2002 - 14:21 #12
Jeg har sat ReadOnly til true. Det er alligevel stadigt muligt at vælge en celle, så markøren blinker. Man kan dog ikke ændre data i cellen.

PS.:
Pointene skal nok blive delt ud! Jeg tænker bare, at det kan være rart for os alle, hvis vi får løst problemet 100%.
Avatar billede nico26 Nybegynder
23. juli 2002 - 14:32 #13
Jeg har også prøvet at lede efter noget der kunne bruges, men jeg har ikke rigtigt fundet noget. Jeg er ikke så skarp til det her - fangede du den :)
Avatar billede herchin Nybegynder
23. juli 2002 - 14:40 #14
Det går nu meget godt :)

Jeg har en idé, men jeg kan ikke lige se, hvordan den skal føres ud i livet. Hvis man klikker på en celle, så må man vel kunne kalde en eller anden funktion, som tilsvarer et klik på RowHeader for samme kollonne. Hvis man brug DataGrid.HitTest, kan man finde ud af, om der er klikket på en celle eller, hvad der nu er klikket på.

Lige nu sidder jeg og rpøver med noget unfocus... Det er bare slet ikke til at finde noget :(
Avatar billede herchin Nybegynder
26. juli 2002 - 12:12 #15
Jeg deler lige pointene efter, hvad jeg har kunnet bruge. Men tak for hjælpen til jer begge!
Avatar billede roger Nybegynder
26. juli 2002 - 13:59 #16
ditDataGrid.MouseUp += new MouseEventHandler(CellClicked);

private void CellClicked(object sender, MouseEventArgs e){
    Point pt = new Point(e.X, e.Y);
    DataGrid.HitTestInfo hti = this.HitTest(pt);
    if(hti.Type == DataGrid.HitTestType.Cell) {
        ditDataGrid.UnSelect(ditDataGrid.CurrentRowIndex);
        ditDataGrid.Select(hti.Row);
        ditDataGrid.CurrentRowIndex=hti.Row;
    }
}

Det med at cellen stadig markeres drillede også mig, men løste det på følgende måde:

Tilføjede en DataGridTableStyle til min DataTable, oprettede mine columns, men de steder hvor jeg skulle bruge DataGridTextBoxColumn, brugte jeg min egen klasse MyDataGridTextBoxColumn, hvor jeg nedarver fra DataGridTextBoxColumn og overrider Edit-metoden:

protected override void Edit(System.Windows.Forms.CurrencyManager
            source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string
            instantText, bool cellIsVisible)

Bare lad denne metode være tom, medmindre du selvfølgelig vil have noget i den.

Det virker, og om det kan gøres nemmere...hmm ved det sq ikke :)
Avatar billede roger Nybegynder
26. juli 2002 - 14:44 #17
this.HitTest(pt);  skulle være -->  ditDataGrid.HitTest(pt);

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