Toon posts:

[C#.Net] DataGridView HeaderCell locatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik had een programma gebouwd, waar een oa datagrid onderdeel van was. Dat wil ik nu gaan uitbreiden met oa een contextmenu dat zich zou openen als er op bepaalde columnheaders van het datagrid zou worden (links enkel) geklikt.
Alleen krijg ik de locatie van de "DataGridViewColumnHeaderCell" niet fatsoenlijk uitgelezen, want ik krijg namelijk waarden die eerder overeen lijken te komen met de positie in column. Dus ik krijg bijvoorbeeld een locatie terug van (3, 10) pixels ipv de (300, 200) pixels die je zou verwachten, waardoor het contextmenu dus in de linkerboven hoek van mijn scherm wordt getekend.

Natuurlijk nog zitten googlen en het enige dat er een beetje dicht bij kwam was weer eens ExpertExchange waarvoor je moet betalen, voor de rest zijn het niet de meest handige zoektermen (datagrid, position, cell, location).

Ik heb dus onder andere de ContentBounds geprobeerd, en het ook met "gewone" cellen, just in case.

Ik zal even een stukje code plaatsen dat er dan nu staat.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void dgvDataGrid_ColumnHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
    string columnName = dgvDataGrid.Columns[e.ColumnIndex].Name;
    if (dgvDataGrid.Rows.Count > 0)
    {
        switch (columnName)
        {
            case "TrackYear":
                Point position = new Point();
                position.X = dgvDataGrid.Columns[e.ColumnIndex].HeaderCell.ContentBounds.Left;
                position.Y = dgvDataGrid.Columns[e.ColumnIndex].HeaderCell.ContentBounds.Bottom;
                cmsYear.Show(position);
                break;
//Hierondergaat het nog door                    


Als iemand mee even in de betere richting kan trappen, of even de juiste aanpak zou kunnen vertellen, dan ehm _/-\o_.

[ Voor 5% gewijzigd door Verwijderd op 07-03-2006 22:53 . Reden: Code even minder laten inspringen, voor uw leesgenot ]


  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Ik begrijp niet helemaal wat je probleem is.
Volgens mij kan je gewoon de ContextMenuStrip van de grid setten.

Verwijderd

Topicstarter
Mijn probleem is dat van een specifieke headercell (bijvoorbeeld de 3e) de absolute positie/lokatie op het scherm terug wil krijgen, maar ik krijg de relatieve terug.

Die is bijvoorbeeld X=3, Y=13 terwijl ik X=203 en Y=313 wil terug krijgen.

Je kunt inderdaad een contextmenu aan een cell of kolom koppelen maar dan moet je rechtklikken en wordt ie getoond op het punt waar je met je muisklikt en dat wil ik van beide niet.

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 09:16

PoweRoy

funky!

kan je de top en left van de datagrip niet bij die 2 waardes optellen? of zie ik dit fout?

[This space is for rent]


Verwijderd

Topicstarter
PoweRoy schreef op woensdag 08 maart 2006 @ 13:32:
kan je de top en left van de datagrip niet bij die 2 waardes optellen? of zie ik dit fout?
Jammer genoeg zie je dat wel verkeerd ;), want dan weet hij nog steeds niet waar de kolom en de rij begint waar ik de contextmenu op wil tonen.
Plus de code gaat er dan steeds meer als volgt uitzien:
C#:
1
2
3
4
Point position = new Point();
position.X = this.Location.X + dgvDataGrid.Location.X + dgvDataGrid.Columns[e.ColumnIndex].HeaderCell.ContentBounds.Left;
position.Y = this.Location.Y + dgvDataGrid.Location.Y + dgvDataGrid.Columns[e.ColumnIndex].HeaderCell.ContentBounds.Bottom;
cmsYear.Show(position);


En dan zou er opzicht ook nog een Location.X kunnen zijn van de colum zelf en een Location.Y voor de row. En ik heb dan echt het gevoel dat het gemakkelijker kan.

[ Voor 7% gewijzigd door Verwijderd op 08-03-2006 13:42 . Reden: Weer inspringen vergeten ]


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
Dan moet je de grid op een Panel doen. De linkerbovenhoek van die Panel heeft dan (0,0), dan open je het menuutje gewoon op de coordinaten van de panel.

Verwijderd

Topicstarter
Mastermind schreef op woensdag 08 maart 2006 @ 18:37:
Dan moet je de grid op een Panel doen. De linkerbovenhoek van die Panel heeft dan (0,0), dan open je het menuutje gewoon op de coordinaten van de panel.
Ja maar dan weet ik dus nog niet de coordinaten van de kolom.
Want met App.Locatie + Grid.Locatie + Kolom.Locatie zou ik er wel moeten zitten :).

[ Voor 1% gewijzigd door Verwijderd op 08-03-2006 20:54 . Reden: Meervoud van moet :P ]


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
Dus je wilt in feite zo'n popupje waar de muis zich bevindt?

C#:
1
cmsYear.Show((Point)Control.MousePosition);

Verwijderd

Topicstarter
Nope ik wil het popupje onder de headercell waar ik op heb geklikt.
Ookal zit de muis er wel bij in de buurt, zou de uitlijning telkens verschillen (want het verschilt als je aan de voorkant klikt van de cell of aan de achterkant).

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 05-04 18:13
C#:
1
2
3
4
5
6
7
8
9
public Point getHeaderCellLocation(int index)
{
Point position = new Point();
position.Y = 3;
for (int n = 0; n < index; n++) { 
position.X += dgvDataGrid.GetCellBounds(1, n).Width;
}
return position;
}

[ Voor 7% gewijzigd door Mastermind op 08-03-2006 22:48 ]

Pagina: 1