Hur gör man en data binding till en variabel i C#?

Permalänk
Medlem

Hur gör man en data binding till en variabel i C#?

Jag har en databas i mysql och har i C# anslutit till den med en tableadapter som sen fyller ett dataset. Datasetet är sen kopplade till olika textboxes genom att klicka på data bindings i property. Jag hade dock behövt ansluta en variabel som enbart finns i koden och inte har något textfält, hur jag gör jag detta enklast? Har googlat som en dåre tycker inte jag hittar något direkt svar på det.

Permalänk
Medlem

Det skulle nog underlätta ifall du delade relevanta delar av koden samt förklarar behovet av det du efterfrågar.
Det är fullt möjligt att det finns en bättre lösning på ditt problem som du inte har sett ännu, men för att hjälpa dig att hitta den behövs mer information.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Såhär ser koden ut, jag försöker alltså binda variabeln extra till kolumnen anmark i min databas. Jag får bara meddelandet "System.ArgumentException: 'Cannot bind to the property 'kommentar' on the target control.
Parameter name: PropertyName'"

Går det att binda en variabel till ett dataset eller måste man göra på ett helt annat sätt?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace test { public partial class Form1 : Form { extraInfo extra = new extraInfo(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dataSet1.betalat' table. You can move, or remove it, as needed. this.betalatTableAdapter.Fill(this.dataSet1.betalat); this.betalatBindingSource.AddNew(); this.DataBindings.Add("kommentar", dataSet1.betalat, "anmark"); } private void mataIn_Click(object sender, EventArgs e) { this.betalatBindingSource.EndEdit(); this.betalatTableAdapter.Update(this.dataSet1.betalat); } } class extraInfo : INotifyPropertyChanged { private string kommentar; public string Kommentar { get { return kommentar; } set { kommentar = value; NotifyPropertyChanged("kommentar"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String pName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(pName)); } } } }

Permalänk
Medlem
Skrivet av Tallrot:

Såhär ser koden ut, jag försöker alltså binda variabeln extra till kolumnen anmark i min databas. Jag får bara meddelandet "System.ArgumentException: 'Cannot bind to the property 'kommentar' on the target control.
Parameter name: PropertyName'"

Går det att binda en variabel till ett dataset eller måste man göra på ett helt annat sätt?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace test { public partial class Form1 : Form { extraInfo extra = new extraInfo(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dataSet1.betalat' table. You can move, or remove it, as needed. this.betalatTableAdapter.Fill(this.dataSet1.betalat); this.betalatBindingSource.AddNew(); this.DataBindings.Add("kommentar", dataSet1.betalat, "anmark"); } private void mataIn_Click(object sender, EventArgs e) { this.betalatBindingSource.EndEdit(); this.betalatTableAdapter.Update(this.dataSet1.betalat); } } class extraInfo : INotifyPropertyChanged { private string kommentar; public string Kommentar { get { return kommentar; } set { kommentar = value; NotifyPropertyChanged("kommentar"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String pName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(pName)); } } } }

Nu var det länge sedan jag jobbade i C# och jag har aldrig provat att göra just detta.
Men om jag läser dokumentationen så måste ju den property du försöker binda finnas på den control du försöker lägga till bindningen på.

I ditt kodexempel ovan försöker du lägga till bindningen på Form, men din property kommentar existerar inte där, utan i klassen extraInfo (klassnamn börjar med stor bokstav förresten).

Om du inte redan gjort det rekommenderar jag att du läser dokumentationen:
Control.DataBindings Property
Binding Class

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Medlem

Jag provade att flytta in propertyn inuti form och nu får jag inget felmeddelande men texten dyker ändå inte upp i databasen. Någon som har ett förslag på lösning?

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace test { public partial class Form1 : Form, INotifyPropertyChanged { private string kommentar; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dataSet1.betalat' table. You can move, or remove it, as needed. this.betalatTableAdapter.Fill(this.dataSet1.betalat); this.betalatBindingSource.AddNew(); this.DataBindings.Add("Kommentar", dataSet1.betalat, "anmark"); } private void mataIn_Click(object sender, EventArgs e) { Kommentar = "bla bla bla bla"; this.betalatBindingSource.EndEdit(); this.betalatTableAdapter.Update(this.dataSet1.betalat); textBox1.Clear(); this.betalatBindingSource.AddNew(); } public string Kommentar { get { return kommentar; } set { kommentar = value; NotifyPropertyChanged("kommentar"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String pName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(pName)); } } } }