[C#] Databinding: standaard waarde ipv DBNull

Pagina: 1
Acties:

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Hi :)

Al geruime tijd zit ik hier te spelen met databinding. Het lukt mij niet goed om een database-kolom NOT NULL (Default (null)) te vullen met een standaard waarde vanuit een Windows form d.m.v. databinding.

De situatie:
- Database server = MySql
- Een database met een table met twee kolommen:
ID (PrimaryKey, bigint(20), autoincrement)
Title (varchar (255), NOT NULL, Default = (null)
- Een windows form met twee objecten:
* BindingSource (bindingSource1)
* BindingNavigator (bindingNavigator1). De BindingSource = bindingSource1

Objecten in code:
- Een MySqlConnection
- Een MySqlDataAdapter met SelectCommand en InsertCommand
- Een DataSet
- DataSet wordt met MySqlDataAdapter gevuld.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  conn = new MySqlConnection();
  conn.ConnectionString = "   ";

  da = new MySqlDataAdapter();
            
  da.SelectCommand = new MySqlCommand();
  da.SelectCommand.Connection = conn;
  da.SelectCommand.CommandText = "SELECT ID, Title FROM titles";
  da.InsertCommand = new MySqlCommand();
  da.InsertCommand.Connection = conn;
  da.InsertCommand.CommandText = "INSERT INTO titles (Title) VALUES (?Title)";
  da.InsertCommand.Parameters.Add("?Title", MySqlDbType.VarChar, 255, "Title");

  ds = new DataSet("DataSet");
  da.FillSchema(ds, SchemaType.Source, "titles");
  da.Fill(ds, "titles");

  bindingSource1.DataSource = ds.Tables[0];


De table bevat het kolom 'Title' welke NOT NULL is en default (null).

Nu heb ik op het formulier een textbox. Databinding doe ik dan als volgt:

code:
1
2
3
  Binding b = new Binding("Text", bindingSource1, "Title");
  b.NullValue = "Standaard waarde";
  textBox1.DataBindings.Add(b);


En nu komt het probleem. Wanneer de gebruiker aan row aanmaakt, en niks intikt in het textbox, dan verschijnt de melding: Column 'Title' does not allow nulls.
Wat op zich logisch is, want er wordt (null) gestuurd naar de onderliggende data source. Maar graag zou ik een default NULL value willen meegeven wanneer men niks intikt.

Wat ik nu niet snap is:
- bij het Binding object geef ik een b.NullValue op. Deze wordt wel in de tekstbox geplaatst, maar niet "gebruikt". Pas wanneer ik als gebruiker tekst intik, wordt dit wel "herkend". Wat is de achterliggende logica dat de NullValue waarde niet wordt gebruikt?
- Op welke manier kan ik het beste omgaan om een standaard waarde mee te geven voor de achterliggende data source wanneer de gebruiker niks invoert, ter voorkoming dat een (null) waarde wordt meegegeven aan de data source?

Alvast bedankt voor jullie hulp!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Misschien kun je iets doen bij de Leave event of Validating event van de TextBox? Ik bind zelf nooit een TextBox en als dat bijv. in een Grid wel gebeurt hide ik de gebinde textboxen en maak ik ongebinde columns ernaast.

Heel lelijk zou je dus een UnboundTextBox kunnen tonen die dezelfde inhoud heeft als een bound hidden BoundTextBox, maar zodra er niets ingevuld is in UnBound "Foo" zet ofzo.

C#:
1
2
3
4
5
6
7
8
        private void UnBoundTextBox_Validating(object sender, CancelEventArgs e)
        {
            // De UnBoundTextBox is visible
            // BoundTextBox is gebind
            // BoundTextBox.Visible = false;
            TextBox txt = (TextBox)sender;
            BoundTextBox.Text = txt.Equals(String.Empty)? "Foo": txt.Text;
        }


Netter kun je beter een CustomControl maken die TextBox extendt waarbij je enkele methods overload.

[ Voor 40% gewijzigd door Mastermind op 28-04-2007 13:27 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Je kan in je typed dataset aangeven wat de default value van een column moet zijn.
Ik heb hier nu geen VS.NET staan, maar het is zeker mogelijk. Als je de XML view van je dataset bekijkt, kan je een 'default' attribute specifieren.

https://fgheysels.github.io/


Verwijderd

whoami schreef op zaterdag 28 april 2007 @ 13:32:
Je kan in je typed dataset aangeven wat de default value van een column moet zijn.
Ik heb hier nu geen VS.NET staan, maar het is zeker mogelijk. Als je de XML view van je dataset bekijkt, kan je een 'default' attribute specifieren.
Dat is inderdaad de beste optie, anders zou je nog voor een ISNULL() in de query kunnen gaan (Ik weet alleen niet wat de MySQL syntax hiervan is).

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Dat had hij al ja? Dat is zijn probleem niet.

  • robertpNL
  • Registratie: Augustus 2003
  • Niet online
Hallo allen,

Allereerst bedankt voor jullie reacties, ondank het mooie weer :)

De standaard waarde meegeven wanneer een nieuwe rij wordt toegevoegd (d.m.v. BindingNavigator of BindingSource object) heb ik kunnen oplossen met event DataTable.TableNewRow. De nieuwe rij wordt als parameter meegegeven en vul ik daarin de standaard waardes. Dit werkt: de gegevens zie ik in controls verschijnen.

@Mastermind: bedankt, maar wat je al aangaf, het is wel lelijk :) De oplossing van mij lijkt mij netter.
@whoami: uiteraard kan ik dit in het XML schema regelen, maar de standaard waarde zijn dynamisch bij iedere nieuw-rij (mwah oké, dan kan het alsnog).

Maar nu merk ik wat anders: er vind zelf geen validatie plaats van het control. Pas wanneer de gebruiker wat intikt, wordt er gevalideerd (event Validating van het control).Is iemand hier bekend mee waarom dit zo is? Laat maar.
Pagina: 1