Avatar billede netro Nybegynder
01. april 2008 - 20:55 Der er 14 kommentarer og
1 løsning

DataGridView - selected row

Jeg har en metode til at opdatere data i et DataGridView. Men jeg har problemer med at sætte en række til selected. Det har bare ingen effekt. Er der en event jeg skal vente på, før jeg sætter selektionen eller hvad?

this.dataGridView1.Rows.Clear();

for (int i = 0; i < 10; i++)
  this.dataGridView1.Rows.Add(i, "abc");

this.dataGridView1.Rows[3].Selected = true;
Avatar billede skov_p Praktikant
01. april 2008 - 23:36 #1
Et bud kunne være...

dataGridView1.SetSelectedRowCore(3, true);

http://msdn2.microsoft.com/en-us/library/system.windows.forms.datagridview.setselectedrowcore.aspx

Jeg har ikke testet det
Avatar billede netro Nybegynder
02. april 2008 - 10:40 #2
Der står den findes i både 2.0 og 3.5, men jeg kan ikke se den...
Avatar billede netro Nybegynder
02. april 2008 - 10:42 #3
'System.Windows.Forms.DataGridView.SetSelectedRowCore(int, bool)' is inaccessible due to its protection level
Avatar billede skov_p Praktikant
02. april 2008 - 12:59 #4
Hov... jeg havde ikke det den var protected.

Dette virker

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.CurrentCell = dataGridView1.Rows[3].Cells[0];
Avatar billede netro Nybegynder
02. april 2008 - 13:29 #5
Hmm... har du selv prøvet? Hos mig huskes den selekterede række, før jeg indlæste nye data.
Avatar billede skov_p Praktikant
02. april 2008 - 15:31 #6
Hvis du clearer den og indlæser nye data huskes selekteringen ikke.
Gem den evt. dataGridView1's tag property
Avatar billede netro Nybegynder
03. april 2008 - 17:43 #7
Synes overhovedet ikke, noget virker. Nu har jeg prøvet at sætte den selekterede række i databindingcomplete. Men den hopper tilbage til det indeks, der var valgt før databinding. Hvis jeg bruger en knap, kan jeg dog godt sætte indeks ved klik på denne.
Avatar billede netro Nybegynder
03. april 2008 - 17:54 #8
Hvis jeg sætter en række messageboxes ind kan jeg se, at den nye række bliver valgt et kort øjeblik. Derefter flyttes selekteringen til den gamle række.
Avatar billede skov_p Praktikant
03. april 2008 - 22:54 #9
Lad os lige tage det fra starten
I dit indledende spm. sætter du rækkerne ind manuelt, nu skriver du databinding???
Er der noget jeg har misforstået?

Dette virker

public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      dataGridView1.Tag = 2;
      AddRows();
     
    }

    public void AddRows() {
      List<Navne> ojbs = new List<Navne>();
      ojbs.Add( new Navne( "Abe", "kat" ) );
      ojbs.Add( new Navne( "Anders", "And" ) );
      ojbs.Add( new Navne( "Fætter", "Højben" ) );
      ojbs.Add( new Navne( "C#", "Styrer" ) );
      dataGridView1.DataSource = ojbs;
      dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
      dataGridView1.CurrentCell = dataGridView1.Rows[(int)dataGridView1.Tag].Cells[0];
    }
  }

  public class Navne {
    public Navne(string fn, string en) {
      _forNavn = fn;
      _efterNavn = en;
    }

    private string _forNavn;

    public string ForNavn {
      get { return _forNavn; }
      set { _forNavn = value; }
    }
    private string _efterNavn;

    public string EfterNavn {
      get { return _efterNavn; }
      set { _efterNavn = value; }
    }
  }
Hvis du vi beholde selektion efter at have cleared og indsat nye rows skal du måske bruge dette

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
  dataGridView1.CurrentCell = dataGridView1.Rows[(int)dataGridView1.Tag].Cells[0];
}
Avatar billede netro Nybegynder
03. april 2008 - 23:04 #10
Undskyld forvirringen. Til at starte med databindede jeg ikke, men nu prøvede jeg at gøre det, for at se om det hjalp på noget.

I dit eksempel vil jeg så have en metode der ændrer et navn, sorterer listen alfabetisk og binder igen. Det betyder, at jeg ikke kan flytte selektionen hen på den nye række.

Mit virker også, når formen bliver initialiseret, men ikke når en sådan update-metode kaldes.
Avatar billede netro Nybegynder
03. april 2008 - 23:06 #11
Men som sagt - hvis jeg lægger koden til at selektere bag en knap, virker det fint, når jeg trykker på knappen, så er som om, at jeg prøver at selektere for tidligt, efter der er databinded.
Avatar billede netro Nybegynder
03. april 2008 - 23:35 #12
Jeg har fundet ud af det. Det er fordi, at update-metoden bliver kaldt fra et modal-vindue, og så skal jeg bruge BeginInvoke fra modal-vinduet for at kalde metoden til sidst.
Avatar billede skov_p Praktikant
03. april 2008 - 23:59 #13
Du behøver ikke databinde igen efter sortering.
Brug dette efter sortering

(BindingContext[dataGridView1.DataSource] as CurrencyManager).Refresh();
Avatar billede netro Nybegynder
04. april 2008 - 00:43 #14
Okay, men det er ikke kun sortering. Det er også editering.
Avatar billede skov_p Praktikant
04. april 2008 - 08:55 #15
Hvis du bruger:

(BindingContext[dataGridView1.DataSource] as CurrencyManager).Refresh();

vil alle ændringer i din datakilde bliver opdateret i det grid
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