Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[.Net] complex binding op custom user control

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met het volgende probleem. Ik heb in .Net een custom user control gemaakt die als attribute ComplexBindingProperties heeft en een datasource en datamember property. Met op de datasource property ook een attributeprovider(gettype(ilistsource)). Per item in de list maak ik een andere nieuwe usercontrol aan die alle informatie weergeeft van het object in die list.

In mijn business object is er een bindinglist die ik bind aan mijn custom user control. Bij het toevoegen van objecten worden de juiste events geraised en wordt alle data juist weergegeven. Nu is mijn probleem dat wanneer ik mijn object inlaad en er zitten al items in mijn lijst ik niet weet hoe ik mijn custom user control moet updaten om gelijk te staan met de list.

Nu zit er bijvoorbeeld 1 item in mijn lijst maar dit wordt niet weergegeven. Ik ben dus opzoek naar de beste manier waarop ik een "initial state" kan voorzien voor mijn usercontrol.

Ik heb alle events al geprobeerd op mijn bindingsource maar dit brengt geen oplossing. Ik kan het doen in mijn Load event, maar dan werkt het enkel als mijn user control in een tabblad zit en dit pas zichtbaar wordt na het inladen van het object.

Iemand die mij op weg kan helpen in welke richting ik moet zoeken? of is het iets onozel dat ik over het hoofd zien?

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Heb je INotifyPropertyChanged geimplementeerd op de objecten in je lijst?

Nu met Land Rover Series 3 en Defender 90


Verwijderd

Topicstarter
jep. Dat werkt al. Het is echt bij het inladen. Ik doe nu dit:

load object (object.lijst heeft nu al 1 item)
objectbindingsource.datasource = object

En in mijn usercontrol waarvan zijn datasource gebind staat op object.lijst krijg ik de lijst met 1 item in. Maar ik weet niet waar ik nu mijn code moet zetten om deze lijst te doorlopen om mijn user control gelijk te zetten met de items in mijn lijst.

(Ik hoop dat het een beetje duidenlijk is, is nogal moeilijk te verwoorden.)

want als ik nu object.lijst.add doe krijg ik wel een event bij mijn bindingsource dat er een nieuw object is toegevoegd en kan ik de juiste actie ondernemen. Hier zie ik dan ook dat ik 2 items heb in mijn lijst.

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

kun je niet op je Set_Datasource method een RaisePropertyChange event afvuren? Hoe worden normaal gesproken de items uit de lijst getekend? Wat gebeurt er biijvoorbeeld nu bij een PropertyChanged event?

Signature van nature


  • Oxidda
  • Registratie: Maart 2010
  • Laatst online: 25-12-2023

Oxidda

Heer Opblaaskrokodil

Sinds je een datasource property hebt, is het een optie om zelf in de set van datasource de items in list toe te voegen aan de UI. Lijkt me dat als je initieel een object inlaad je de datasource set?

Of word de datasource eenmaal gezet en is je bindingsource altijd hetzelfde? Anders zou het misschien kunnen verklaren waarom de events op je bindingsource niet werken.

Zonder een concreet voorbeeld kanb ik ook niet meer dan gokken iig.

Verwijderd

Topicstarter
In de setter wordt enkel de datasource gezet, nog niet de lijst. Ik maak gebruik van binding in winforms. ( MSDN: BindingSource Class (System.Windows.Forms) ) Dit verzorgt de koppeling tussen mijn UI en business objects.
Ik ga het schematisch proberen uitleggen :-)

Ik heb een eigen user control gemaakt die het attribute complexbinding heeft en een property datasource.

Visual Basic .NET: usercontrol.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<ComplexBindingProperties("DataSource", "DataMember")>
Public Class UcUserControl
  <Bindable(True), AttributeProvider(GetType(IListSource))>
  Public Property DataSource As Object
    Get
      Return BindingSource.DataSource
    End Get
    Set(value As Object)
      BindingSource.DataSource = value
    End Set
  End Property

  Public Property DataMember As String
    Get
      Return BindingSource.DataMember
    End Get
    Set(value As String)
      BindingSource.DataMember = value
    End Set
  End Property

  Private Sub BindingSource_ListChanged(sender As Object, e As ListChangedEventArgs) Handles BindingSource.ListChanged
    If e.ListChangedType = ListChangedType.ItemAdded Then
     'Pseudo
       VoegItemToe(item)
    End If
  End Sub

  Private Sub VoegItemToe(item as BusinessObject)
    ' Create new UserControlB and me.children.add(newUserControlB)
    ' Hierdoor krijg ik per object een eigen usercontrol te zien
  End Sub
End Class


Dit werkt allemaal goed, enige probleem is nu, dat als mijn DataSource gebind is op een bovenligende usercontrol met ook een bindingsource en die bovenstaande datasource wordt geset wordt de binding wel gedaan maar ik krijg nergens een verwitiging dat het binden complete is. Ik heb de events BindingComplete (wordt niet opgeroepen), Listchanged (Heeft een type reset, maar dit wordt altijd opgeroepen als de lijst is veranderd), DatasourceChanged (wordt opgeroepen voor de lijst is opgevuld)

Hetzelfde met de setter, als ik na de setter code uitvoer is de lijst nog niet opgevuld, dat gebeurd blijkbaar ergens achteraf automagisch :?

Momenteel is het opgelost door in de onload event van mijn usercontrol het initieel adden van de user controls te doen, maar dit werkt nu enkel omdat mijn usercontrol in een tabblad zit en de onload dus wordt opgeroepen op de moment dat het tabblad zichtbaar wordt, zet ik het van in het begin zichtbaar heeft dit hetzelfde probleem dat de lijst nog neit is opgevuld. Ik zou dus ook graag een betere oplossing hebben zodat ik dit in het vervolg kan voorkomen. (Of een goede uitleg hoe de interne werking van bindgsources is zou ook handig zijn, op internet vind je veel hoe het te gebruiken, maar niet hoe het werkt)

  • Oxidda
  • Registratie: Maart 2010
  • Laatst online: 25-12-2023

Oxidda

Heer Opblaaskrokodil

Is er ook een method om het databinden te forceren? Misschien is dat wel nodig.

Ben jammer genoeg al tijden niet met windows applicaties bezig alleen web meuk. Daarbij moet je altijd databind aanroepen (Nu weet ik dat dat in windows niet nodig zou moeten zijn).

Is er ook geen Event die af gaat wanneer je het tabblad zichtbaar word gemaakt, om zo dan nog wat te doen op je usercontrol. Of misschien op je usercontrol zelf.

Is er niets in de richting van OnVisible changed? Of heb je bijv een shell waarvan uit je kan aanroepen "Intialiseer de boel maar"
Pagina: 1