[gelöst] Page in ASP.net verwenden

21. Dezember 2010 11:44

Hallo zusammen,


kennt sich jemand mit der Veröffentlichung einer Page in ASP.net aus?
Mein Problem ist, wenn ich in ASP.net eine Page mit einem GridView veröffentliche und einige Werte editiere, bekomme ich immer einen leeren GridView-Inhalt zurück. Auch wenn ich nur die Werte ans GridView übergebe und sofort wieder auslese ist der Inhalt immer leer, obwohl die Daten angezeigt werden.


Beispielcode: (VS 2008, C#)

Code:
myCustomers = (CustomerPage.Customer[])GridView1.DataSource;  // <---- Datasource ist immer null, obwohl Daten drin sind?
myCustomer.UpdateMultiple(ref myCustomers);
 GridView1.EditIndex = -1;
 GridView1.DataSource = myCustomers;
 GridView1.DataBind();


Wenn ich eine ganz normale Windows Form erstelle und das Gleiche mit einem DataGridView erstelle, dann funktioniert alles wunderbar :roll:

Kenn jemand das Problem oder hat jemand einen Rat, woran es liegen könnte?

mfg
Zuletzt geändert von aydina81 am 31. Januar 2011 11:58, insgesamt 3-mal geändert.

Re: Page in ASP.net verwenden

3. Januar 2011 12:51

Hast Du irgendeine Anleitung/Sample von MSDN dafür benutzt?

Gruß
Jan

Re: Page in ASP.net verwenden

4. Januar 2011 14:33

Wo wird denn der o. g. Code aufgerufen?

Volker

Re: Page in ASP.net verwenden

10. Januar 2011 11:04

Erst einmal ein frohes neues Jahr.

Also der Code wird in der Ereignismethode "RowUpdating" aufgerufen:

Code:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            myCustomers = (CustomerPage.Customer[])GridView1.DataSource;  // [b]Datasource ist immer null[/b]         
            myCustomer.UpdateMultiple(ref myCustomers);           
            GridView1.DataSource = myCustomers;
            GridView1.EditIndex = -1;
            GridView1.DataBind();
        }


Ich will ja nur die aktuell geänderten werte an die Datenbank weitergeben. Leider kann ich das nicht, weil anscheinend die aspx Seite bei jeder Aktion immer neugeladen wird und somit wird mein Gridview neu erzeugt.

Ich habe bereits mit Page_Preload versucht die Daten zwischenzuspeichern, aber leider sind dort bereits die Daten schon weg.

Code:
 protected void Page_PreLoad(object sender, EventArgs e)
        {
            myGridView.DataSource = GridView1.DataSource;  // myGridView ist statisch
        }


Da muss es doch etwas einfaches geben, um der Seite zu sagen, lade bitte die Seite neu (oder gar nicht) aber mein Gridview nicht?!



Mit einer ganz normalen Windows-Form da klappt die ganze Geschichte, weil die Form sich ja nicht neulädt!


Hat jemand eine Idee, wie ich das verhindern kann, dass die Daten weg sind?
Zuletzt geändert von aydina81 am 12. Januar 2011 12:03, insgesamt 1-mal geändert.

Re: Page in ASP.net verwenden

10. Januar 2011 11:51

Was Du brauchst ist http://msdn.microsoft.com/de-de/library/system.web.ui.page.ispostback.aspx, damit die Daten nicht vor Übermittlung wieder vom Server abgerufen werden und versucht wird erneut an das Datagrid zu binden.

Volker

Re: Page in ASP.net verwenden

10. Januar 2011 14:46

Hi Volker,

danke für die schnelle Rückmeldung.

Leider klappt es mit der "Validate" Methode auch nicht.

Hier ist mal der gesamte Code

Code:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace OnlyGridView_Test
{
    public partial class _Default : System.Web.UI.Page
    {
        static CustomerPage.Customer_Service myCustomer = new CustomerPage.Customer_Service();
        static System.Net.NetworkCredential nc;
        static GridView myGridView = new GridView();
        static CustomerPage.Customer[] myCustomers;
        static PlaceHolder myPlaceHolder = new PlaceHolder();

        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                Page.PreLoad += new EventHandler(Page_PreLoad);
                //Page.PreInit += new EventHandler(Page_PreInit);
                //Page.PreRender += new EventHandler(Page_PreRender);
                //Page.Disposed += new EventHandler(Page_Disposed);

                nc = new System.Net.NetworkCredential();
                nc.Domain = "cdom";
                nc.UserName = "user1"; //login.userName;
                nc.Password = "passwd1"; //login.userpasswd;

                myCustomer.Credentials = nc;
                myGridView.AutoGenerateColumns = true;

                myGridView.AutoGenerateEditButton = true;
                myGridView.AutoGenerateSelectButton = true;
               
                             
                Validate();
            }           
                   

        }

        protected void Page_PreLoad(object sender, EventArgs e)
        {
            myGridView.DataSource = GridView1.DataSource;
        }

        protected void Customers_Click(object sender, EventArgs e)
        {
            myCustomers = myCustomer.ReadMultiple(null, null, 0);
            GridView1.DataSource = myCustomers;
            GridView1.DataBind();
           
               }

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

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            myCustomers = (CustomerPage.Customer[])GridView1.DataSource;
            myCustomer.UpdateMultiple(ref myCustomers);           
            GridView1.DataSource = myCustomers;
            GridView1.EditIndex = -1;
            GridView1.DataBind();
        }

        protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            GridView1.EditIndex = -1;
            GridView1.DataSource = myCustomers;
            GridView1.DataBind();
        }

                     
    }
}



Code:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <br />
            <asp:GridView ID="GridView1" runat="server" AllowSorting="True"
                AutoGenerateColumns="False" CellPadding="4" DataKeyNames="Key"
                ForeColor="#333333" GridLines="None"
                OnRowCancelingEdit="GridView1_RowCancelingEdit"
                onrowcommand="GridView1_RowCommand" onrowdatabound="GridView1_RowDataBound"
                onrowdeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing"
                OnRowUpdating="GridView1_RowUpdating" ShowFooter="True">
                <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                <Columns>
                    <asp:CommandField HeaderText="Edit-Update" ShowEditButton="True" />
                    <asp:BoundField DataField="Name" HeaderText="Name" />
                    <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" />
                </Columns>
                <RowStyle BackColor="#E3EAEB" />
                <EditRowStyle BackColor="#7C6F57" />
                <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
                <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
                <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                <AlternatingRowStyle BackColor="White" />
            </asp:GridView>
            <br />
        </ContentTemplate>



Wenn ich auf Aktualisierung vom GridView klicke, dann sind die Daten weg also mein Gridview leer?!

Ich will die geänderten Werte auch in der Datenbank aktualisieren. Hilfe!!
Zuletzt geändert von aydina81 am 12. Januar 2011 12:03, insgesamt 1-mal geändert.

Re: Page in ASP.net verwenden

10. Januar 2011 14:50

Hi Volker,


ich hattes es auch mal mit einem Datagrid versucht, da war das gleiche Problem. Also ist es im Grunde egal, was für ein Objekt ich zur Darstellung verwende.

Irgednwie muss man doch die geänderten Daten im GridView verwenden können, sonst macht doch das ganze Konzept keinen sinn.

Re: Page in ASP.net verwenden

10. Januar 2011 16:20

wofür lädst Du myCustomers neu?

aydina81 hat geschrieben:static CustomerPage.Customer[] myCustomers;
// ...
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
myCustomers = (CustomerPage.Customer[])GridView1.DataSource; // <= ???
myCustomer.UpdateMultiple(ref myCustomers);
GridView1.DataSource = myCustomers;
GridView1.EditIndex = -1;
GridView1.DataBind();
}

Re: Page in ASP.net verwenden

10. Januar 2011 16:33

Hi Volker,


myCustomer wird nicht neugeladen, sondern nur dafür verwendet, um die im GridView geänderten Werte wieder abzulegen und so die (Default) Funktionen der Page zu verwenden. So kann ich meine NAV Datenbank aktualisieren. Und zum Schluss wird der Bearbeitungsmodus beendet und die aktuellen Werte angezeigt.
Das einzige Problem dabei ist, dass mein GridView immer wieder neu erzeugt wird und somit die Werte nicht mehr beinhaltet.

Deswegen die Frage, ob es eine Möglichkeit gibt mein GridView nicht jedes Mal neu zu erzeugen?

Re: Page in ASP.net verwenden

10. Januar 2011 22:45

Hallo aydina81,

dein Quelltext ist leichter zu lesen und zu verstehen, wenn du ihn zwischen so genannte Code-Tags setzt. Insbesondere deine Formatierungen werden so auch beibehalten.

Daher bitten wir dich, vor und nach deinem Quelltext diese Code-Tags einzufügen. Beispiel:


[code]Dein Quelltext[/code]

Gruß, Kai
MSDynamics.de-Team

Re: Page in ASP.net verwenden

11. Januar 2011 10:18

Danke für den Tipp Kai.

Code:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace OnlyGridView_Test
{
public partial class _Default : System.Web.UI.Page
{
static CustomerPage.Customer_Service myCustomer = new CustomerPage.Customer_Service();
static System.Net.NetworkCredential nc;
static GridView myGridView = new GridView();
static CustomerPage.Customer[] myCustomers;
static PlaceHolder myPlaceHolder = new PlaceHolder();

protected void Page_Load(object sender, EventArgs e)
{

if (!IsPostBack)
{
Page.PreLoad += new EventHandler(Page_PreLoad);
//Page.PreInit += new EventHandler(Page_PreInit);
//Page.PreRender += new EventHandler(Page_PreRender);
//Page.Disposed += new EventHandler(Page_Disposed);

nc = new System.Net.NetworkCredential();
nc.Domain = "cdom";
nc.UserName = "user1"; //login.userName;
nc.Password = "passwd1"; //login.userpasswd;

myCustomer.Credentials = nc;
myGridView.AutoGenerateColumns = true;

myGridView.AutoGenerateEditButton = true;
myGridView.AutoGenerateSelectButton = true;


Validate();
}


}

protected void Page_PreLoad(object sender, EventArgs e)
{
myGridView.DataSource = GridView1.DataSource;
}

protected void Customers_Click(object sender, EventArgs e)
{
myCustomers = myCustomer.ReadMultiple(null, null, 0);
GridView1.DataSource = myCustomers;
GridView1.DataBind();

}

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

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
myCustomers = (CustomerPage.Customer[])GridView1.DataSource;
myCustomer.UpdateMultiple(ref myCustomers);
GridView1.DataSource = myCustomers;
GridView1.EditIndex = -1;
GridView1.DataBind();
}

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
GridView1.DataSource = myCustomers;
GridView1.DataBind();
}


}
}




<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<br />
<asp:GridView ID="GridView1" runat="server" AllowSorting="True"
AutoGenerateColumns="False" CellPadding="4" DataKeyNames="Key"
ForeColor="#333333" GridLines="None"
OnRowCancelingEdit="GridView1_RowCancelingEdit"
onrowcommand="GridView1_RowCommand" onrowdatabound="GridView1_RowDataBound"
onrowdeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing"
OnRowUpdating="GridView1_RowUpdating" ShowFooter="True">
<FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<Columns>
<asp:CommandField HeaderText="Edit-Update" ShowEditButton="True" />
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:CommandField HeaderText="Delete" ShowDeleteButton="True" />
</Columns>
<RowStyle BackColor="#E3EAEB" />
<EditRowStyle BackColor="#7C6F57" />
<SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
<PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
</asp:GridView>
<br />
</ContentTemplate>



Gruß Aydin

Re: Page in ASP.net verwenden

12. Januar 2011 10:11

aydina81 hat geschrieben:Danke für den Tipp Kai.

Gern geschehen, nur solltest du damit die alten Beiträge editieren. Dazu den Codeblock markieren und dann den Code-Button drücken.

Re: Page in ASP.net verwenden

12. Januar 2011 14:17

A little OT:

Hast Du dir mal das ASP.NET MVC (Model View Controller) angeschaut?
Ich habe von dem Scott Hanselman auf channel 9 mir zwei Videos angeschaut, und dann auch recht gut nachvollziehen können, wie das strukturiert ist.
Aus meiner Sicht auch für NAV eine gute Möglichkeit, strukturiert vorzugehen.

Viele Grüße,
Jan