DataTable in einem neuen Button bearbeiten

lecoeur

Grünschnabel
#1
Hallo,

Ich möchte eine DataTable bearbeiten. Beim Klicken des Buttons "Reserve Anzeigen" werden folgende Code bearbeitet:

Code:
 private void commande_Click(object sender, EventArgs e)
  {
if (txbmontant.Text == "" || txbmontant.Text == "0")
  {
  Fehler_Meldung;
  }
  else
  {
  MySqlCommandBuilder bldlivraison = new MySqlCommandBuilder();
  MySqlConnection conn = new MySqlConnection(MyConnectionString);
  
  string montant = txbmontant.Text;
  cmd.CommandText = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using  (pureenr) WHERE compartiment = " + montant;
  cmd.CommandType = CommandType.Text;
  cmd.Connection = conn;

  da.SelectCommand = cmdSelect1;
  ds.DataSetName = "ds";
  dtlivraison.TableName = " dtlivraison";
  ds.Tables.Add ( dtlivraison);
  bldlivraison.DataAdapter = da;
  //DataTable füllen
  da.Fill(ds, " dtlivraison");
  bslivraison.DataSource = ds;
  bslivraison.DataMember = " dtlivraison";
  grd.DataSource = bslivraison;
  }
}
Bisher funktioniert alles sehr gut. Das Problem fängt erst jetzt an. Ich möchte die Zeile aufrufen, um mit der Bearbeitung fortsetzen zu können. Beim Klicken des neuen Buttons "Pureenr anzeigen" werden folgende Code bearbeitet
Code:
 private void commande_Click(object sender, EventArgs e)
{
 if (pureenr.text== "")
  {
  Fehler_Meldung
  }
  else
  {
  Int16 searchnr;
  int col;
  //Prozedur

  searchnr = Convert.ToInt16(pureenr.text);
  col = bslivraison.Find("artikel_nr", searchnr);
  txbpureenom.Text = Convert.ToString(ds.Tables["dtlivraison"].Rows[col][1]);
  txbquantite.Text = Convert.ToString(ds.Tables["dtlivraison"].Rows[col][2]);
  txbcage.Text = Convert.ToString(ds.Tables["dtlivraison"].Rows[col][3]); 
  }  
}
Dann erscheint diese Fehlermeldung:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
ist auch klar warum. mein DataTable und Grid wurde alle in der ersten Suche definiert. Wie könnte ich es bearbeiten, sodass ich es bei der neue Suche benutzen darf.
Danke für jede Hilfe.
 

lecoeur

Grünschnabel
#2
Der Zweite Eventhandler heisst anders:

Code:
private void commandeBearbeitung_Click(object sender, EventArgs e){}
ich verwende Windows Form
 
Zuletzt bearbeitet:

ksk

Erfahrenes Mitglied
#3
So wie ich das sehe solltest du dir zuerst mal Gedanken über deinen Code-Aufbau machen.
Generell sollten keine DB-Actions direkt in Click-Events durchgeführt werden.
Zu einem ist Sie nicht gut Wartbar zum anderen, Stichwort "Schichtentrennung".

Erstelle dir eine function welcher die nach deiner abfrage ein DataTable zurück gibt.
Hier nur ein Ansatz, man sollte natürlich den Statement über parameter erhalten um Dynamisch zu bleiben.
Bsp:
Code:
public datatable getdata(){
  Datatable RESULT = new Datatable();
  MySqlCommandBuilder bldlivraison = new MySqlCommandBuilder();
  MySqlConnection conn = new MySqlConnection(MyConnectionString);
 
  string montant = txbmontant.Text;
  cmd.CommandText = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using  (pureenr) WHERE compartiment = " + montant;
  cmd.CommandType = CommandType.Text;
  cmd.Connection = conn;
  da.Fill(RESULT);
  return RESULT;
  // Den restlichen Schmarn brauchst hier nicht
}
Jetzt kannst die Daten mal abfragen und Zuweisen
Code:
  // Entweder direkt übergeben oder einer globalen Variable falls an anderen Stellen benötigt wird.
  bslivraison.DataSource = getdata();
Um jetzt einen Vergleich durchzuführen bzw. einen Wert zu übergeben ist es einfacher in diesem
Fall auf die DataSource wieder zuzugreifen. Das geht dann mit einem Convert.
Bsp:
Code:
// Datenquelle wieder an ein DataTable falls keine Globale Variable verwendet wird, übergeben
Datatable dtSource = ((DataTable) bslivraison.DataSource);
IEnumerable<DataRow> query = dtSource .AsEnumerable().Where(x => x.Field<int>("artikel_nr") == searchnr);
if (query != null && query.Count() == 1)
{
  foreach (DataRow dr in query)
  {
     txbpureenom.Text = dr [1].tostring();
     txbquantite.Text = dr [2].tostring();
     txbcage.Text = dr [3].tostring();
  }
}
...
gib bescheid ob die das geholfen hat.


Lg ksk