Toon posts:

[NET / WinForms] hoe huidige focussed control verkrijgen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil op een makkelijke manier de control die op dit moment focus heeft verkrijgen. Ik weet dat het kan door alle controls bij langs te lopen en de focus op te vragen, maar dit is behoorlijk veel en vervelend werk. Nou vroeg ik mij af of het mogelijk is om dit op een andere manier te doen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:49

Creepy

Tactical Espionage Splatterer

In Delphi heeft een form een ActiveControl property. Ik gok erop dat er in .NET ook wel zo'n property is.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Sterker zelfs, in .NET heeft die property dezelfde naam.

https://fgheysels.github.io/


Verwijderd

Topicstarter
oke, bedankt. geeft ie ook bijv de huidige cell weer van een datagrid, als die cell focus heeft?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Nee

https://fgheysels.github.io/


Verwijderd

Topicstarter
ai dat is jammer, heeft iemand misschien een idee hoe ik het volgende makkelijk voor elkaar kan krijgen?

probleem :
Ik heb een applicatie gemaakt die uit meerdere schermen bestaat (tabs). Op elk van die schermen zijn controls gekoppeld aan een DataSet of DataView (met databinding). Nou heb ik bij elke control het volgende gedaan, bij focus enter zeg ik:

((DataRowView)this.GetBindingManager().Current).BeginEdit();

en bij focus leave:
((DataRowView)this.GetBindingManager().Current).EndEdit();

Nou zou het mooi zijn als een control ook de focus verloor als een gebruiker een save knop op de toolbar of het save item in een menu aanklikt, maar dit gebeurd dus niet. Ik moet eigenlijk een simpele manier hebben om op de dataset EndEdit() uit te voeren. Heeft iemand een idee, dat zou mij namelijk een hoop saai programmeerwerk besparen.

Ik zou ook voor elke table zijn rows in de dataset gewoon endEdit aan kunnen roepen maar ik weet niet wat het effect is als ik endEdit aanroep zonder daarvoor beginEdit().

[ Voor 10% gewijzigd door Verwijderd op 02-08-2004 14:36 ]


Verwijderd

Ik weet de syntax niet precies, maar zoiets:

code:
1
2
3
if (isinstance(ThisForm.ActiveControl, DataView)) {
  ((DataRowView)((DataView)ThisForm.ActiveControl).GetBindingManager().Current).EndEdit();
}

[ Voor 3% gewijzigd door Verwijderd op 02-08-2004 14:45 ]


Verwijderd

Topicstarter
oke. bedankt!

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Ik begrijp dat je een datagrid wil saven, maar daarvoor eerst uit edit mode vandaan moet toch ?
Met een infragistics grid is het:
code:
1
2
3
4
5
6
7
8
9
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
UltraGrid1.ActiveRow = Nothing
        UltraGrid1.PerformAction(Infragistics.Win.UltraWinGrid.UltraGridAction.ExitEditMode)
        UltraGrid1.UpdateData()
        Dim build As New SqlClient.SqlCommandBuilder(mycommand)
        mycommand.Update(mydataset, "t_medewerkers")
        bindgrid()
End Sub


Dus dan zal het wel zoiets worden:

code:
1
2
3
4
5
6
7
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
     
datagrid1.endedit
datagrid1.updatedata()

End Sub

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Het probleem is dat ik niet weet welke control de focus heeft en dus ook niet weet op welke row ik EndEdit() aan moet roepen. Maar ik doe het wel op de niet slimme manier, namelijk voor elke tab bij langs gaan of een control de focus heeft, als dit zo is, dan op de BindingManager.Current EndEdit aanroepen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
De BindingManager weet welke Row er de focus heeft. Een CurrencyManager heeft nl. een Position property, en die property geeft aan welke row (index) er de actieve row is.

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Je kan sowieso toch een endedit op al je grids geven in je tabbladen ?
Dan hang je dit achter je "Opslaan" knopje.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Remc0 schreef op 02 augustus 2004 @ 16:16:
Je kan sowieso toch een endedit op al je grids geven in je tabbladen ?
Dan hang je dit achter je "Opslaan" knopje.
Maar geeft dit geen problemen als je geen beginEdit hebt opgegeven.

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Ik zou zeggen, probeer het.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Het hangt er een beetje van af. Als het component goed geschreven is, mag er in elk geval niks kapot gaan.

Je hebt dan twee kansen: òf het component laat het stilletjes gebeuren, of het gooit een exception. In het eerste geval ben je klaar, en in het tweede kun je de exception afvangen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:17
Verwijderd schreef op 02 augustus 2004 @ 16:35:
[...]


Maar geeft dit geen problemen als je geen beginEdit hebt opgegeven.
BeginEdit wordt -dacht ik- impliciet opgeroepen als je iets gaat veranderen in een cel.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 02 augustus 2004 @ 18:00:
[...]


BeginEdit wordt -dacht ik- impliciet opgeroepen als je iets gaat veranderen in een cel.
Dat klopt idd, maar ik ga nu op elke data row die current is in een scherm een endEdit doen zonder dat je zeker weet dat daarvoor een beginEdit is aangeroepen of misschien is er al een keer een beginEdit en een endEdit aangeroepen.

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Ik kwam dit tegen:

code:
1
2
3
4
5
6
Host: Scott (Microsoft)
Q: I've seen many people having problems getting the pending changes into the data
 source of a bound grid. I recommended a grid.EndEdit( null, rowNum, false ), followed 
by a CurrencyManager.EndCurrentEdit(). Is this ok, or is there a better method?

A: That's the way to do it.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Remc0 schreef op 02 augustus 2004 @ 20:01:
Ik kwam dit tegen:

code:
1
2
3
4
5
6
Host: Scott (Microsoft)
Q: I've seen many people having problems getting the pending changes into the data
 source of a bound grid. I recommended a grid.EndEdit( null, rowNum, false ), followed 
by a CurrencyManager.EndCurrentEdit(). Is this ok, or is there a better method?

A: That's the way to do it.
Een endEdit op de datasource die gebonden is aan een control werkt niet als die control focus houdt. Ik heb de dataGrid.EndEdit nog niet geprobeerd, maar bij TextBoxes etc... werkt dit niet.

Ik heb het geprobeerd met een datagrid, zoals je voorstelde. Maar dit werkt dus niet, de waarde van de huidige cell die geedit is wordt niet opgeslagen.

code :
code:
1
2
3
4
5
6
7
8
9
10
public void EndEdit()
{
    if((this.telefoonNummersDataGrid.CurrentRowIndex > 0) && (this.telefoonNummersDataGrid.CurrentCell.ColumnNumber > 0))
    {
        DataGridColumnStyle dgc = this.telefoonNummersDataGrid.TableStyles[0].GridColumnStyles[0];
        this.telefoonNummersDataGrid.EndEdit( dgc, this.telefoonNummersDataGrid.CurrentRowIndex, false );
        CurrencyManager cm = (CurrencyManager)this.BindingContext[this.dataView];
        cm.EndCurrentEdit();
    }
}

[ Voor 34% gewijzigd door Verwijderd op 03-08-2004 13:16 ]

Pagina: 1