C# DataTable bearbeiten in einem zweiten Such Button

coulio

Cadet 2nd Year
Registriert
Juni 2014
Beiträge
31
Hallo,
Habe einige Themen gelesen leider habe ich die Loesung meines Problems nicht gefunden.
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 commandeBearbeitung_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.
 
Zuletzt bearbeitet:
Mir stellen sich so ein paar Fragen:
Liegen die 2 Buttons auf unterschiedlichen Formen?
Warum heißen die Eventhandler "commande_Click" bei dir gleich?
Wo wurde das DataTable definiert?
Verwendest du Windows Forms oder WPF?
 
Rossibaer schrieb:
Mir stellen sich so ein paar Fragen:
Liegen die 2 Buttons auf unterschiedlichen Formen?
Warum heißen die Eventhandler "commande_Click" bei dir gleich?
Wo wurde das DataTable definiert?
Verwendest du Windows Forms oder WPF?

Dansche schon mal.


oO das war ein Fehler.

ne die liegen alle in einem gleichem Form und der zweiten heißt anders, nämlich:
1. private void commandeBearbeitung_Click(object sender, EventArgs e)
{}

das DataTable wurde bei dem ersten Button definiert. dort wird dieses DataTable angezeigt. ja ich verwende Windows Form.
 
In deinem Code kann ich nicht die Deklaration vom DataTable sehen. Ich hätte jetzt so eine Zeile erwartet wie z.b.

Code:
DataTable dtlivraison = new DataTable();

Dem ist aber nicht so, also wo wird das DataTable erzeugt?

Unabhängig davon:
Da deine Methoden innerhalb einer Klasse stecken, könntest du das DataTable auch in der Klasse selbst, statt in der Methode definieren. Dann hättest du Zugriff in jeder Methode dieser Klasse und könntest das DataTable überall in der Klasse referenzieren,z.B.:

Code:
class XYZ
{
  DataTable dtlivraison = new DataTable();

  void ButtonX_Click(object sender, EventArgs e)
  {
    FuellDieTabelle(dtlivraison);
  }

  void ButtonY_Click(object sender, EventArgs e)
  {
    MachWasIchWillMit(dtlivraison);
  }
}
 
Also , ich habe mein Problem selber loesen können.

Mir ist aufgefallen, dass ich alles allgemein definieren kann und dann bei der erste Suche nur filtern. Bei der zweite Suche werden dann alles ausfindig und alles funktioniert super.

Nur jetzt habe ich das Problem was ich schon in einem anderem Thema gestellt hatte aber anders.

Sei bitte nicht böse.


Code:
private void commande_Click(object sender, EventArgs e)
{
string abtnr = txbmontant.Text;
                bslivraison.DataSource = ds;
                bslivraison.DataMember = "dtlivraison";

                //Visualisierung Grid
                grdlivraison.DataSource = bslivraison;
               
                bslivraison.Filter = "compartiment = '" + txbmontant.Text + "'";

                for (int i = 0; i < dtlivraison.Rows.Count; i++)
                {
                    if (Convert.ToInt16(dtlivraison.Rows[i][3]) < Convert.ToInt16(dtlivraison.Rows[i][4]))
                    {
                        label.Text = "ist ok";
                    }
                    else
                    {
                        label.Text = "NICHT OK";
                        break;
                    }
                }
}
natürlich geht es hier nicht mehr um die dataTable dtlivraison, sonderm um die Filterung.
Wie sollte ich bitte die For- und If-Schleife bearbeiten, damit das Label.text gut angezeigt wird?
Ergänzung ()

sowas ist mir nicht aufgefallen. Sehr gute Idee. danke.
 
ich verstehe jetzt nicht wo das Problem ist. Erkläre mal genauer was du erreichen willst, sonst wird dir wahrscheinlich keiner helfen können... Und übrigens: Warum sollte ich dir böse sein? Ist doch ok, wenn man fragt...
 
Folgendes Problem habe ich.

Code:
 public partial class frmcontrolle : Form
    {
        DataSet ds = new DataSet();
        DataTable dtlivraison = new DataTable();
        BindingSource bslivraison = new BindingSource();
        MySqlDataAdapter da = new MySqlDataAdapter();
        MySqlCommand cmdSelect = new MySqlCommand();
 
        
        string MyConnectionString = "Server=local.....;";

     .........

private void frmcontrolle_Load(object sender, EventArgs e)//so heisst mein Form
        {
           MySqlCommandBuilder bldlivraison = new MySqlCommandBuilder();
                MySqlConnection conn = new MySqlConnection(MyConnectionString);
                
                string montant = txbmontant.Text;
                cmd.CommandText = "SELECT compartiment, pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using   (pureenr) ";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
 
 
               da.SelectCommand = cmdSelect;
               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";
 
            grdlivraison.DataSource = bslivraison;
        } 
private void commande_Click(object sender, EventArgs e)
{
string abtnr = txbmontant.Text;
                bslivraison.DataSource = ds;
                bslivraison.DataMember = "dtlivraison";
 
                //Visualisierung Grid
                grdlivraison.DataSource = bslivraison;               
                bslivraison.Filter = "compartiment = '" + txbmontant.Text + "'";
 
                for (int i = 0; i < dtlivraison.Rows.Count; i++)
                {
                    if (Convert.ToInt16(dtlivraison.Rows[i][3]) < Convert.ToInt16(dtlivraison.Rows[i][4]))
                    {
                        label.Text = "ist ok";
                    }
                    else
                    {
                        label.Text = "NICHT OK";
                        break;
                    }
                }
}

Ich bekomme immer "NICHT OK" auch wenn die Bedingung nicht erfüllt ist :(

Aus dem Debuging kann ich folgendes lesen:

dtlivraison.Rows.Count 12 int

obwohl ich nur 4 Datensätze nach dem "Filtern" habe.
Das ist auch normal. Schliesslich arbeite ich in meiner For- und if-Schleife mit dem dtlivraison. Nach der Überlegung sollte ich bestimmt etwas anderes anstatt "dtlivraison" schreiben, da ich in der dtlivraison filtere.

Ich möchte in der Filterung prüfen, ob alle Datensätze der dritten Spalten kleiner sind als der 4. Spalte. wenn das der Fall ist, dann Label.Text sollte "ist OK" anzeigen, sonst "NICHT OK".

Meine Frage ist dann, wie prüfe ich alle Datensätze aus einer Filterung?
 
das DataTable enthält alle Zeilen die über das Select Kommando aus der Datenbank gezogen werden. Dann machst du einen Filter über BindingSource gehst aber bei der Überprüfung auf das DataTable, statt die BindingSource zu verwenden. Das heißt du solltest eher auf BindingSource prüfen ob die Werte ok sind oder nicht. Vielleicht hilft dir das hier weiter (habs jedoch nicht getestet und eher roh zusammen gestöpselt!):

Code:
bslivraison.DataSource = ds;
bslivraison.DataMember = "dtlivraison";
bslivraison.Filter = "compartiment = '" + txbmontant.Text + "'";
foreach(DataRow dr in bslivraison.List)
{
  if(dr[3] < dr[4])
    label.Text = "ist ok";
  else
    label.Text = "NICHT OK";
}
 
Zurück
Oben