[C#] DataBinding in XAML code

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Spaiker
  • Registratie: Maart 2009
  • Laatst online: 14:39
Dag Tweakers,

Zonet enkele uren googlen achter de rug, ik kom er niet uit.
Voor school moeten we een project maken, dat C# en .NET combineert. Hierbij maken we gebruik van Web Services. Een gewoon C form hebben we aangemaakt voor de admin. Deze kan records toevoegen aan de database. Dit werkt. Maar de GUI voor de users heb ik in Blend gemaakt (ook in opdracht van de lector). Hierbij genereert Blend een hoop XAML code.

Onze gegevens worden in en DataSet opgeslagen en zou gebonden moeten worden aan één (of meerdere) TextBoxes die de gegevens weergeven. Hierdoor moet ik een paar aanpassingen doen in de XAML code, heb ik al enkele dingen op google gevonden. maar dat hield in een aparte dataTable aan te maken. Mijn vraag was of dit niet gemakkelijker kon en de dataSet aan de textbox "binden". Dezelfde code die ik in het C admin form gebruikte kon ik dus niet hergebruiken (gedeeltelijk wel, maar daar bleef het ook bij).

Hier maak ik de textboxes leeg, en vul het met de gegevens in de dataset.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 private void BindFields()
        {
            try
            {
                txtANaam.DataBindings.Clear();
                txtVNaam.DataBindings.Clear();
                txtGBD.DataBindings.Clear();
                txtANaam.DataBindings.Add("Text", myDataSet, "Acteurs.Acteur_Naam");
                txtVNaam.DataBindings.Add("Text", myDataSet, "Acteurs.Acteur_Voornaam");
                txtGBD.DataBindings.Add("Text", myDataSet, "Acteurs.Acteur_Geboortedatum");
            }
            catch (Exception ex)
            {
                objLoggingService.WriteLine(strAppName, ex.Message);
                throw ex;
            }
        }
Error 2 'System.Windows.Controls.TextBox' does not contain a definition for 'DataBindings' and no extension method 'DataBindings' accepting a first argument of type 'System.Windows.Controls.TextBox' could be found (are you missing a using directive or an assembly reference?)
En hier probeer ik een DataSet doorlopen mogelijk te maken met een CurrencyManager, maar bij de this.dataContext.. Krijg ik ook een foutmelding.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void FillDataSetAndView()
        {
            try
            {
                myDataSet = wsActeur.GetAllActeurs();
                cmAdresses = (CurrencyManager)(this.DataContext[myDataSet, "Acteurs"]);

            }
            catch (Exception ex)
            {
                objLoggingService.WriteLine(strAppName, ex.Message);
                throw ex;
            }
        }
Error 1 Cannot apply indexing with [] to an expression of type 'object'
Deze heb ik al kunnen oplossen :)
Spaiker schreef op zondag 26 februari 2012 @ 10:07:
[...]


Ik had in het begin van de code een BindingContext aangemaakt
code:
1
  private BindingContext bc = new BindingContext();


Die heb ik in de regel kunnen gebruiken waar ik de foutmelding op kreeg, toen werkte het wel.
code:
1
cmAdresses = (CurrencyManager)(this.bc[myDataSet, "Acteurs"]);


Enkele sites had ik al gevonden, maar zal ze nog eens grondig doornemen :)
Dank voor de replies.
Mijn groepsgenoot en ik zitten met de handen in het haar, des te meer we proberen, des te meer fouten krijgen we. Mailen naar de lector leverde ons enkel antwoorden in de aard van "Zoek het op in het boek" en "daar bestaat google voor". Maar hijzelf vergeet dat hij dit nooit in de les gegeven heeft.

Mocht iemand mij een klein beetje kunnen op weg helpen zou ik al heel dankbaar zijn

[ Voor 10% gewijzigd door Spaiker op 26-02-2012 10:59 ]

Drive it like you stole it.


Acties:
  • 0 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 10-09 21:09
Moet het niet bij elke regel als volgt zijn:
C#:
1
txtANaam.DataBindings.Add(new Binding("Text", myDataSet, "Acteurs.Acteur_Naam"));

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Spaiker schreef op zaterdag 25 februari 2012 @ 21:04:
Voor school moeten we een project maken, dat C# en .NET combineert.
offtopic:
Een bijzondere zin is dat. Wellicht dat je WPF ipv .NET bedoeld. ;)
Hier maak ik de textboxes leeg, en vul het met de gegevens in de dataset.
DataBindings kan daar gewoon niet, de foutmelding lijkt me duidelijk.. :p
[google=xaml textbox dataset] geeft oa
MSDN: Windows Presentation Foundation Data Binding: Part 2
MSDN: Walkthrough: Binding WPF Controls to a Dataset

Genoeg om mee aan de slag te gaan? :p
Deze heb ik al kunnen oplossen :)
offtopic:
De daadwerkelijke oplossingen posten wordt gewaardeerd mocht iemand dit topic toevallig vinden.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 14:00
DoDo schreef op zaterdag 25 februari 2012 @ 22:44:
Moet het niet bij elke regel als volgt zijn:
C#:
1
txtANaam.DataBindings.Add(new Binding("Text", myDataSet, "Acteurs.Acteur_Naam"));
Wat hij zegt ^^

Een ding onthouden. Elk probleem is waarschijnlijk al langs geweest en te vinden op Google. Meestal volstaat een google query als deze "msdn [controltype] [propertynaam]".

MSDN: Control.DataBindings Property (System.Windows.Forms)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Nog zo'n msdn-pagina is MSDN: ControlBindingsCollection.Add Method (String, Object, String) (System.Windows.Forms)

Maar let op, het gaat hier niet om System.Windows.Forms.Control maar om System.Windows.Controls.Control... ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Spaiker
  • Registratie: Maart 2009
  • Laatst online: 14:39
pedorus schreef op zondag 26 februari 2012 @ 00:00:
offtopic:
De daadwerkelijke oplossingen posten wordt gewaardeerd mocht iemand dit topic toevallig vinden.
Ik had in het begin van de code een BindingContext aangemaakt
code:
1
  private BindingContext bc = new BindingContext();


Die heb ik in de regel kunnen gebruiken waar ik de foutmelding op kreeg, toen werkte het wel.
code:
1
cmAdresses = (CurrencyManager)(this.bc[myDataSet, "Acteurs"]);


Enkele sites had ik al gevonden, maar zal ze nog eens grondig doornemen :)
Dank voor de replies.

Drive it like you stole it.


Acties:
  • 0 Henk 'm!

  • Spaiker
  • Registratie: Maart 2009
  • Laatst online: 14:39
Uiteindelijk het antwoord doorgekregen van een mede-student;

Eerst dataset aanmaken, dan CurrencyManager aanmaken en een BindingContext
code:
1
2
3
DataSet DSFilms = new DataSet();
private CurrencyManager cmFilms;
private BindingContext bc = new BindingContext();


Dan je dataset vullen en binden aan je currencymanager
code:
1
2
DSFilms = wsActeur.GetAllFilms();
cmFilms = (CurrencyManager)(this.bc[DSFilms, "Films"]);


Als je je window load, voer je het vullen van de dataset uit, zet je je currencymanagers op 0, en roept bindfields op (waar je je waardes naar een textbox stuurt)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 private void Window_Loaded(object sender, System.Windows.RoutedEventArgs e)
        {
            FillDataSetAndView();
            cmAdresses.Position = 0;
            cmFilms.Position = 0;
            BindFields();


        }
        private void BindFields()
        
            {
                String FilmTitel = DSFilms.Tables[0].Rows[cmFilms.Position][1].ToString();
                String FilmGenre = DSFilms.Tables[0].Rows[cmFilms.Position][2].ToString();
                String FilmReg = DSFilms.Tables[0].Rows[cmFilms.Position][3].ToString();
              
                txtFilmTitel.Text = FilmTitel;
                txtFilmRegisseur.Text = FilmReg;
                txtFilmGenre.Text = FilmGenre;
            }


Hier steek je dus een waarde van de dataset in een string, die je dan naar je textbox stuurt. De waardes die na position staan, zijn de waardes van de kolomindexen in de dataset.

Om te scrollen door de gegevens heb ik 2 knoppen aangemaakt, die tellen bij de currencymanager 1 op, trekken er 1 van af, zodoende kan je navigeren.

code:
1
2
3
4
5
6
7
8
9
10
 private void btnFilmsVorige_Click(object sender, RoutedEventArgs e)
        {
            cmFilms.Position -= 1;
            BindFields();
        }
        private void btnFilmsVolgende_Click(object sender, RoutedEventArgs e)
        {
            cmFilms.Position += 1;
            BindFields();
        }


Dit is dus wat ik nu heb, ik hoop dat er later iemand iets aan zal hebben :)

Drive it like you stole it.


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Er klopt toch iets niet. Je wil XAML bindings gebruiken, en toch gebruik je DataBindings, een property uit WinForms.

Meestal (90% kans) doe je bij XAML de binding vanuit de XAML zelf, niet vanuit code.

Ook spreek jij over bindings terwijl je gewoon waarden rechtstreeks update, je gebruikt dus geen bindings. Dat is juist de kracht van Bindings. Het gebeurt een beetje magisch achter de schermen. Ik zou eens goed inlezen over WPF/XAML Bindings, en over hoe je die moet gebruiken.

neem dit artikel eens door: MSDN: Windows Presentation Foundation Data Binding: Part 1

[ Voor 13% gewijzigd door Snake op 28-02-2012 08:16 ]

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Spaiker
  • Registratie: Maart 2009
  • Laatst online: 14:39
De manier die wij hebben gebruikt, mag dat niet?
We hadden op een bepaalde manier een dataset aangemaakt, maar dat was niet goed, we moesten een dataset uit een webservice halen, en deze naar een wpf formulier sturen. Er is niets gezegd over of het effectief doen aan databinding.

Drive it like you stole it.

Pagina: 1