Laden...

GridView Editing?

Erstellt von DiscMaster vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.482 Views
DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren
GridView Editing?

Hallo zusammen,

Ich habe ein GridView. Darunter ein button 'neue Zeile'. Bei einem klick auf diesem button soll die zeile in einer DataTable angelegt werden - funktioniert auch. dann soll die zeile noch gleich im bearbeitungsmodus erscheinen (gv.editindex = 'letzte zeile') - funktioniert nicht?! wieso nicht?

klicke ich dann im nachhinein auf den button 'bearbeiten' passiert einfach mal garnichts, ausser das die zeile verschwindet!

jetzt klicke ich erneut auf den bearbeiten button, und siehe da, die zeile erscheint im bearbeitungsmodus! aber wieso erst jetzt?

Nebenbei: wenn ich die zeile nicht im bearbeitungsmodus einfüge, dann verhält sich das alles genauso.

wegen dem rowediting hab ich ne anleitung aus nem buch (ASP.NET in 21 Tagen von Chris Payne)


protected void gv_RowEditing(object sender, System.Web.UI.WebControls.GridViewEditEventArgs e)
{
    gv.EditIndex = e.NewEditIndex;
    gv.DataBind();
}

Gruß DiscMaster

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

hey, bitte leute, ich brauch dringend hilfe, ich bin total am verzweifeln!

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Das Problem ist, dass der RowEditing-Event vor dem Click-Event deines Buttons abgearbeitet wird. siehe auch ASP.NET Page Lifecycle

Wieso machst du das ganze nicht gleich im Handler deines Buttons?

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

Im Handler meines buttons? ich dachte das wäre der handler meines buttons?!

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Du hast gesagt, dass du dann ne neue Row in die DataTable schreibst, davon steht nichts in deinem Handler. Daher dachte ich, dass du einen Click-Handler hast für deinen Button...

Poste sonst mal etwas Markup/Code wie die Sache aufgebaut ist.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

das ist es im wesentlichen....aber ich glaube kaum das das weiterhilft.....


protected void lst13ContentItems_RowEditing(object sender, System.Web.UI.WebControls.GridViewEditEventArgs e)
{
	lst13ContentItems.EditIndex = e.NewEditIndex;
	lst13ContentItems.DataBind();
}

//der handler zum hinzufügen der datarow:
protected void btn13NewRow_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
	tbl13.Rows.Add(new object[] {DateTime.Now.ToString("G") });
	DataBind();
}

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Wie schon gesagt, der Click-Event wird nach dem RowEditing-Event abgearbeitet, dass kann so nicht funktionieren (und erklärt auch, wieso es nach dem zweiten Mal funktioniert).

Wie gesagt, mach doch alles im Button-Click - dann hast du keine Probleme beim Ablauf.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

generell hast du recht, ich hab das auch schonmal so probiert, aber selbst wenn das beim zeile einfügen funktionieren würde, bingt mich das nicht wirklich weiter, weil der bearbeiten-button in der zeile ja auch nicht funktioniert?!

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

der Button in der Zeile sollte keine Probleme machen, wenn der CommandName auf "Edit" gesetzt ist.


<asp:Button ID="editButton" runat="server" Text="Mach mal" CommandName="Edit" />

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

nein, mißverständnis:

der neue-zeile-button ist ein asp:button

der bearbeiten-button ist ein button der vom gridview generiert wird....

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

der sollte aber funktionieren, ohne irgendwelches zutun (also weg mit der lst13ContentItems_RowEditing-Methode).

Hast du das schon so probiert? Wie ist das verhalten dann? Wie und wo bindest du deine Daten an das GridView?

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

ja, hab ich probiert, aber dann passiert garnichts...... wenn ich dann ein zweites mal drauf klicke gibts ne exception.... irgendwas wegen callback und postback ..... ich komm hier grad so nach und nach auf den trichter das hier mit jedem post-back alle werte null gesetzt werden, mit anderen worten ich kann hier ganix speichern?! das erklärt dann auch warum die datarow immer wieder verschwindet in dem moment wo ich eine neue hinzufügen will..... muss ich die ganzen objekte jetz in cookies oda so auslagern?! ich dachte sowas verwalten asp.net für mich?!

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Das kommt darauf an, wie du dein GridView aufbaust. Umso weniger du selbst macht, umso mehr macht ASP.NET für dich =)

Poste doch mal, wie du deine Daten an die GridView bindest.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

lst13ContentItems.DataSource = ds.Tables[stbl13] // >Die Tabelle wo die zeile mit dem neue-zeile-button eingefügt wird;
DataBind();

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

also was da sicherlich mal noch drumrum gehört ist ein:


if(!IsPostBack)
{
   lst13ContentItems.DataSource = ds.Tables[stbl13];
   DataBind();
}

Damit verhinderst du, dass die Tabelle jedesmal neu aufgebaut wird (was überflüssig ist, dank View- und Controlstate.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

jap, gute idee, nur die sache ist das mit jedem postback, also auch wenn ich auf nen button klick, dann wird die seite praktisch neu initialisiert, und damit ist die deklaration z.B. vom dataset
DataSet ds;
wieder auf null gesetzt!
damit ist die tabelle auch wieder weg

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Original von DiscMaster
jap, gute idee,

Das ist keine Idee, sondern der normale Weg 😁 Das DataBinding erfolgt initial und wenn Änderungen an der Source gemacht werden.

Original von DiscMaster
nur die sache ist das mit jedem postback, also auch wenn ich auf nen button klick, dann wird die seite praktisch neu initialisiert, und damit ist die deklaration z.B. vom dataset
DataSet ds;
wieder auf null gesetzt!
damit ist die tabelle auch wieder weg

Hast du das mal probiert oder ist das einfach eine Annahme?
Wenn das GridView nicht neu erstellt werden muss, ist es auch ziemlich wurscht, ob die Datengrundlage noch da ist oder nicht...
Ist dein GridView im Markup definiert oder wird es dynamisch erstellt? Probier das mit dem IsPostBack mal aus, wenns nicht hinhaut poste was passiert und etwas kompletteren Code (inkl. MarkUp), sonst geht das hier noch ewig hin und her 🙂

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

also wenn ich das mit dem postback mache, dann passiert ganix mehr, weil die datenbindung ja nur noch beim page-load ausgeführt wird.........

aaalso, hier n bisschen code:

	void Bind13()
	{
		if (!Page.IsPostBack)
		{
			//lst13ContentItems.DataBind();
			lst13ContentItems.DataSource = ds.Tables[stbl13];
			DataBind();
		}
	}
	protected void chb13ActiveColumns_SelectedIndexChanged(object sender, EventArgs e)
	{
		for (int i = 0; i < chb13ActiveColumns.Items.Count; i++)
			lst13ContentItems.Columns[i].Visible = chb13ActiveColumns.Items[i].Selected;
	}
	protected void lst13ContentItems_RowEditing(object sender, System.Web.UI.WebControls.GridViewEditEventArgs e)
	{
		lst13ContentItems.EditIndex = e.NewEditIndex;
		Bind13();
	}
	protected void btn13NewRow_Click(object sender, System.Web.UI.ImageClickEventArgs e)
	{
		tbl13.Rows.Add(new object[] {DateTime.Now.ToString("G") });
		lst13ContentItems.EditIndex = lst13ContentItems.Rows.Count;
		Bind13();
	}
	protected void lst13ContentItems_RowDeleting(object sender, System.Web.UI.WebControls.GridViewDeleteEventArgs e)
	{
		//tbl13.Rows[e.RowIndex].Delete();
		Bind13();
	}
	protected void lst13ContentItems_RowUpdating(object sender, System.Web.UI.WebControls.GridViewUpdateEventArgs e)
	{
		//ds.Tables[stbl13].ImportRow(lst13ContentItems.Rows);

		Bind13();
	}
	protected void lst13ContentItems_RowCancelingEdit(object sender, System.Web.UI.WebControls.GridViewCancelEditEventArgs e)
	{
		lst13ContentItems.EditIndex = -1;
		lst13ContentItems.DataBind();
	}

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

also wenn ich das mit dem postback mache, dann passiert ganix mehr, weil die datenbindung ja nur noch beim page-load ausgeführt wird.........

mmh wie gesagt, die datenbindung sollte einmal initial und dann nur noch bei Änderungen (an der DataSource) erfolgen. Bei einem PostBack wird dein GridView dann automatisch aus den View- und ControlState-Daten neu erstellt.

Deine Abfrage auf IsPostBack ist noch am falschen Ort. Korrekterweise müsste das nun irgendwie so aussehen:


protected void Page_Load(object sender, EventArgs e)
{
   if(!IsPostBack)
      Bind13();
}

void Bind13()
    {
        if (!Page.IsPostBack)
        {
            lst13ContentItems.DataSource = ds.Tables[stbl13];
            lst13ContentItems.DataBind(); // [B]das ist schon korrekt so![/B]
        }
    }

Was du immer noch nicht gesagt hast, ist wo dein GridView definiert wird. Es macht einen rechten Unterschied, ob das GridView dynamisch im Code oder im MarkUp definiert wird.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

ups, sorry, das wird im markup definiert....

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg

175 Beiträge seit 2006
vor 16 Jahren

Also ich hab da mal ein kleines Sample gebastelt, dass aufzeigen soll, wie das in etwa funktioniert.

MarkUp:


<asp:GridView ID="GridView1" runat="server" AutoGenerateEditButton="true" OnRowEditing="GridView1_RowEditing">
        </asp:GridView>

Und hier noch das CodeBehind:


public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable source = GenerateDataSource();
            GridView1.DataSource = source;
            GridView1.DataBind();
        }
    }

    // irrelevant, nur ein kleiner Helper
    private static DataTable GenerateDataSource()
    {
        Random rnd = new Random();
        DataTable ret = new DataTable();
        ret.Columns.Add(new DataColumn("Col1"));
        ret.Columns.Add(new DataColumn("Col2"));

        for (int i = 0; i < 10; i++)
            ret.Rows.Add(rnd.Next(), rnd.Next());

        return ret;
    }

    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {
        GridView1.EditIndex = e.NewEditIndex;
        DataTable source = GenerateDataSource();
        GridView1.DataSource = source;
        GridView1.DataBind();
    }
}

Wichtig ist halt eben, dass das !IsPostBack um das Binding im Page_Load, sowie dass die Daten neu gebunden werden, wenn das RowEditing geklickt wird.

Wenn du die neuen DataSource-Controls verwendest, würde das ganze etwas einfacher werden, da das GridView mit diesen viel besser interagiert.

DiscMaster Themenstarter:in
316 Beiträge seit 2006
vor 16 Jahren

ok danke einstweilen.

aber ich habe hier ein neues problem: wenn ich eine command für eine zeile ausführe, egal welches (edit, delete,...) und ich habe nur eine zeile in der auflistung, dann gibt es eine ArgumentOutOfRangeException: Der Index lag auserhalb des Array-Bereichs. dabei habe ich den Index aus den EventArgs genommen. Und wenn ich die Zeilen mit meinen eigenen Augen Zähle, dann ist da für mich eindeutig eine Zeile zu sehen! Ich habe dann einfach mal das Rows.Count-Property abgerufen und siehe da: 0! wieso?

Danke,

DiscMaster

EDIT: hat sich erledigt, war wiedermal ein kleines PostBack-Problemchen.

"Flache Hierarchien schaffen! Das muss konkret nicht unbedingt etwas bedeuten, kommt aber immer sehr gut an."
Bernd Stromberg