[C#] Voor BindingSource_PositionChanged controleren en post

Pagina: 1
Acties:

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
Hoi,

Ik het een scherm met daarop controls die via een bindingSource gekoppeld zijn aan een datatable op een dataSet. Als ik via een BindingNavigator naar een volgend record ga wil ik het oude record controleren en als er wijzigingen zijn deze meteen doorvoeren naar de database.

Als ik het BindingSource_PositionChanged event gebruik ben ik te laat want dan ben ik al gegaan naar een volgend record.

Iemand een idee hoe ik dit het beste kan doen.

Alvast bedankt.

http://www.labee.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Kijk eens naar de andere events van je bindingsource en naar het validating event van je controls :?

[ Voor 29% gewijzigd door RobIII op 16-12-2006 00:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
Dat zijn er niet zo heel veel (De complete lijst van events):
- AddingNew
- BindingComplete
- CurrentChanged
- CurrentItemChanged
- DataError
- DataMemberChanged
- DataSourceChanged
- ListChanged
- PositionChanged

En ik wil eigenlijk zo laat mogelijk controleren dus niet bij het valideren van een control.

[ Voor 35% gewijzigd door labee op 16-12-2006 01:01 ]

http://www.labee.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Niets verhinderd je natuurlijk om je eigen BindingSource te gaan maken.

Ik heb net even 5 minuutjes geprutst, en je kan dus zelf een eigen BindingSource gaan maken die overerft van BindingSource. In jouw custom BindingSource kan je dan een extra event maken 'PositionChanging' bv.
code:
1
2
3
4
5
6
7
8
9
10
public class MyBindingSource : BindingSource
{
    public event EventHandler PositionChanging;

    protected void OnPositionChanging( EventArgs e )
    {
         if( PositionChanging != null )
              PositionChanging(this, e);
    }
}


Ik heb dan geprobeerd om deze event te triggeren als de Positie veranderd wordt:
code:
1
2
3
4
5
6
7
8
9
10
public MyBindingSource : BindingSource
{
      ...

      protected override void OnPositionChanged( EventArgs e )
      {
           this.OnPositionChanging(e);
           base.OnPositionChanged (e);
      }
}

Maar dit werkt helaas niet. Blijkbaar is de positie al veranderd op dat moment, en gebeurt dit dus niet in OnPositionChanged.
Even mbhv Reflector naar BindingSource kijken leert ook dat de Positie op dat moment al veranderd is. De OnPositionChanged method wordt aangeroepen wanneer de CurrencyManager waar de BindingSource rond wrapped, zijn positie al veranderd heeft.
Jammergenoeg ziet het er naar uit dat die members private zijn, dus daar kan je niet zo makkelijk aan komen....

* whoami nog even verder kijkt.

https://fgheysels.github.io/


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Je bent geïnteresseerd in veranderingen in je data. Dan moet je niet naar de binding, maar naar de dataset zelf kijken. Vang dus de Datatable.Rowchanged event op (of Rowchanging als je de verandering wilt valideren).

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
Bedankt voor je reactie. Ik heb gekeken naar het RowChanging event maar ik kom er niet echt uit.

Als ik op het RowChanging event van een dataTable ga zitten dan ben ik volgens mij nog steeds te laat. Want hoe zorg ik er dan voor dat de wijzigingen niet worden opgeslagen als de velden niet door de controle heen komen..??..

Daarnaast gaat het RowChanging event af bij het gaan naar een ander record maar hoe controleer ik dan of het record is gewijzigd?
En hoe kan ik zorgen dat er niet naar een andere Row wordt gegaan en de post (endEdit) niet wordt uitgevoerd.

code:
1
2
3
4
5
6
7
8
9
    private void Row_Changing(object sender, DataRowChangeEventArgs e)
    {
      if (e.Action == DataRowAction.Change)
      {
        Console.Beep(200, 200);
        
        e.Action = DataRowAction.Nothing;   // Readonly property
      }
    }

http://www.labee.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Daarnaast gaat het RowChanging event af bij het gaan naar een ander record maar hoe controleer ik dan of het record is gewijzigd?
Als je gebruik maakt van DataSets / DataTables kan je dat toch makkelijk doen door te kijken naar de RowState.
Als je custom objecten hebt, zal je zelf een property moeten voorzien die dit aangeeft.

https://fgheysels.github.io/


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

labee schreef op zaterdag 16 december 2006 @ 23:55:
Daarnaast gaat het RowChanging event af bij het gaan naar een ander record maar hoe controleer ik dan of het record is gewijzigd?
C#:
1
DataRow.RejectChanges
, maar dan weet ik niet hoe de vervolgevents gaan reageren. Het verbaast me eigenlijk dat er geen DataRowChangeEventArgs.Cancel is.

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
Als ik RejectChanges() gebruik krijg ik de melding dat dat niet mag tijdens een Change Event.
Maar dat ik een exception moet geven.

Dat wil ook niet helemaal vlekkeloos werken maar als dat problemen gaat geven dan ga ik dichter bij de interface zitten en daar op wat events reageren voordat er een post kan plaats vinden.

Bedankt..

http://www.labee.nl

Pagina: 1