Laden...

Ärger mit einem Datatable

Erstellt von dass vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.972 Views
D
dass Themenstarter:in
122 Beiträge seit 2006
vor 17 Jahren
Ärger mit einem Datatable

Hi,

ich habe folgendes Problem:

Ich versuche durch einen Klick auf den Auswählen-Button in einem DataGrid eine Zeile aus dem Datatabel (nicht aus dem Grid) in verschiedene Textboxes auszugeben.

Folgenden Code verwende ich:

private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
		{
			//Daten in Textboxes anzeigen
			DataSet aset=dsKunden;
			DataTable atable=aset.Tables["Kunden"];
			DataRow arow=atable.Rows[this.DataGrid1.SelectedItem.ItemIndex];

			this.Textbox8.Text=arow.ItemArray[0].ToString();
			this.TextBox2.Text=arow.ItemArray[1].ToString();
			this.TextBox3.Text=arow.ItemArray[2].ToString();
			this.TextBox4.Text=arow.ItemArray[3].ToString();
			this.Textbox5.Text=arow.ItemArray[4].ToString();
			this.Textbox6.Text=arow.ItemArray[5].ToString();
			this.Textbox7.Text=arow.ItemArray[6].ToString();
			this.TextBox9.Text=arow.ItemArray[9].ToString();
		}

dsKunden funktioniert einwandrei, weil dort auch das Grid selbst gebunden ist. Die Daten werden richtig angezeigt usw.

In der Zeile DataTable atable=aset.Tables["Kunden"]; mault er rum: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt. Also, die Tabelle ist auch vorhanden.

Wo ist da der Fehler, oder bin ich blind.

Schöne Grüße

Das S

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
Hast Du mal im Debugger geschaut ob vielleicht Dein Handler schon aufgerufen wird bevor dsKunden initialisiert wird? -> Das würde den Effekt erklären. dsKunden sollte auf jeden Fall im Page-Load besetzt werden.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
dass Themenstarter:in
122 Beiträge seit 2006
vor 17 Jahren

Ich habe es jetzt mal anders versucht:

Wenn ich folgendes schreibe:
private DataSet AlleAnzeigen()
{
string selectCommand="select * from kunden order by kundennummer";
SqlConnection conn=Datenverbindung.SqlVerbindung();
SqlDataAdapter adapter=new SqlDataAdapter(selectCommand,conn);
DataSet dsalleanzeigen=new DataSet();
adapter.Fill(dsalleanzeigen,"Kunden");
return dsalleanzeigen;

	}  

Jetzt funktioniert die Auswahl der Zeile im Grid einwandfrei mit:

DataSet aset=AlleAnzeigen();
DataTable atablekunden=aset.Tables["Kunden"];
DataRow arowkunden=atablekunden.Rows[this.DataGrid1.SelectedItem.ItemIndex];
this.Textbox8.Text=arowkunden.ItemArray[0].ToString();
this.TextBox2.Text=arowkunden.ItemArray[1].ToString();
this.TextBox3.Text=arowkunden.ItemArray[2].ToString();
this.TextBox4.Text=arowkunden.ItemArray[3].ToString();
this.Textbox5.Text=arowkunden.ItemArray[4].ToString();
this.Textbox6.Text=arowkunden.ItemArray[5].ToString();
this.Textbox7.Text=arowkunden.ItemArray[6].ToString();
this.TextBox9.Text=arowkunden.ItemArray[9].ToString();

Mache ich aber

private DataSet dsKunden

private void AlleAnzeigen()
{
string selectCommand="select * from kunden order by kundennummer";
SqlConnection conn=Datenverbindung.SqlVerbindung();
SqlDataAdapter adapter=new SqlDataAdapter(selectCommand,conn);
DataSet dsalleanzeigen=new DataSet();
adapter.Fill(dsalleanzeigen,"Kunden");
dsKunden=dsalleanzeigen;

	}  

Jetzt funktioniert die Auswahl nicht mit

DataSet aset=dsKunden;
DataTable atablekunden=aset.Tables["Kunden"];
DataRow arowkunden=atablekunden.Rows[this.DataGrid1.SelectedItem.ItemIndex];
this.Textbox8.Text=arowkunden.ItemArray[0].ToString();
this.TextBox2.Text=arowkunden.ItemArray[1].ToString();
this.TextBox3.Text=arowkunden.ItemArray[2].ToString();
this.TextBox4.Text=arowkunden.ItemArray[3].ToString();
this.Textbox5.Text=arowkunden.ItemArray[4].ToString();
this.Textbox6.Text=arowkunden.ItemArray[5].ToString();
this.Textbox7.Text=arowkunden.ItemArray[6].ToString();
this.TextBox9.Text=arowkunden.ItemArray[9].ToString();

Ich verstehe nicht warum ?

3.170 Beiträge seit 2006
vor 17 Jahren

Jetzt funktioniert die Auswahl nicht mit

DataSet aset=dsKunden;
DataTable atablekunden=aset.Tables["Kunden"];

Fehlt jetzt noch der Aufruf von AlleAnzeigen() vor der Zuweisung?

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
dass Themenstarter:in
122 Beiträge seit 2006
vor 17 Jahren

AlleAnzeigen wird mit einem ButtonClick ausgeführt mit folgenden Code
this.DataGrid1.DataSource=AlleAnzeigen();
this.DataGrid1.DataBind();

Wie gesagt, die Daten werden richtig angezeigt.

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
da liegt wahrscheinlich genau das Problem:
die DataTable wird gefüllt, dann ist der ClickHandler zu Ende und die Seite wird erstmal an den Client ausgeliefert. Wenn dann die nächste Anfrage an den Server kommt, ist dsKunden wieder leer, da eine neue Instanz der Page erstellt wurde.
Lösungsmöglichkeiten:

  • dsTables in Page_Load besetzen oder
  • dsTables in Deinem Handler besetzen vor der Zuweisung auf aset oder
  • dsTables nicht als private Variable, sondern in der Session unterbringen -> dann bleiben Dir die Daten erhalten.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
dass Themenstarter:in
122 Beiträge seit 2006
vor 17 Jahren

Kannst Du mir bitte mal für jeden Deiner Lösungen ein beispiel schreiben, weil ich nicht genau weiß, was Du meinst

Vielen Dank für Deine Hilfe

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
entweder in der Methode Page_Load dsKunden initialisieren:
Wenn's die Methode nicht gibt bis jetzt, einfach dazuschreiben.

protected void Page_Load(object sender, EventArgs e)
{
  dsKunden = AlleAnzeigen();

}

oder in Deinem Handler:

private void DataGrid1_SelectedIndexChanged(object sender, System.EventArgs e)
        {
            //Daten in Textboxes anzeigen

    // !! Hier dsKunden besetzen!!
           dsKunden = AlleAnzeigen();
      // --> dann könntest Du aber AlleAnzeigen auch gleich hier auf aset zuweisen.
            DataSet aset=dsKunden;
            DataTable atable=aset.Tables["Kunden"];
            DataRow arow=atable.Rows[this.DataGrid1.SelectedItem.ItemIndex];

            this.Textbox8.Text=arow.ItemArray[0].ToString();
            this.TextBox2.Text=arow.ItemArray[1].ToString();
            this.TextBox3.Text=arow.ItemArray[2].ToString();
            this.TextBox4.Text=arow.ItemArray[3].ToString();
            this.Textbox5.Text=arow.ItemArray[4].ToString();
            this.Textbox6.Text=arow.ItemArray[5].ToString();
            this.Textbox7.Text=arow.ItemArray[6].ToString();
            this.TextBox9.Text=arow.ItemArray[9].ToString();
        }

oder dsKunden in der Session halten

// zum speichern in der Sitzung wird
dsKunden = AlleAnzeigen();
// dann zu
Session["dsKunden"] = AlleAnzeigen();

// zum laden aus der Sitzung
aset = (DataSet)Session["dsKunden"]

müßten eigentlich alle funktionieren.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.170 Beiträge seit 2006
vor 17 Jahren

Verdammt - redest Du eigentlich von GUI oder von ASPX ?
Ich war jetzt gerade bei ASPX !! Sorry.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
dass Themenstarter:in
122 Beiträge seit 2006
vor 17 Jahren

Ich war bei ASPX 😁

Vielen Dank