Laden...

DataSource-Grundlagen

Erstellt von Lexodus vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.550 Views
L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 17 Jahren
DataSource-Grundlagen

Hallo zusammen;

Ich möchte hier eine Art Thread zur Sammlung aller Infos über DataSource machen, mir ist aufgefallen das einige Threads teilweise verwirrend sind (da die Datasource teilweise doch unterschiedlich(oft) gesetzt wird.)

Meine Ausgangssituation;

Ich habe eine IList als DataSource (prinzipiell egal welcher Typ aber IList ist ziemlich einfach als Beispiel)

Anzeige der Daten übernimmt ein Grid.

Das erzeugen setzen verwalten und speichern der DataSource geschieht dynamisch, also nicht im deklarativen Teil. (Das erzeugen und zuweisen passiert bei mir im Page Load if PostBack = False)

Die DataSource wird nicht bei jeder Änderung gleich persistiert/gespeichert sondern zu einem späteren Zeitpunkt, sie soll also über die Roundtrips hinweg erhalten bleiben.

Unter diesen Umständen muss ich die DataSource im Viewstate ablegen (da ich sie verliere sobald der Roundtrip kommt)

Denn


IList myList = WebGrid.DataSource

Funktioniert nicht wenn ich die DataSource dynamisch setze und nach dem Roundtrip abfrage --> das war aus anderen Forum-Threads nicht so klar.
Wenn dies Funktionieren würde, müsste ich mich nicht "manuell" um den Viewstate der Source bemühen.

An dem Ort an dem ich die DataSource manipuliere hole ich sie mir ausm Viewstate.
Mache meine Manipulation und setze sie wieder auf das Grid, danach kommt der Bind. Dieser Bindvorgang muss bei jedem Postback ausgeführt werden resp. an dem Ort wo ich die Datasource manipuliere, sonst verliere ich das Bindig. (Würde ich die DataSource im deklarativen Teil setzen wäre dies nicht der Fall).

Es wäre extrem wichtig für mich, wenn ihr mich korrigiert falls ich irgendwas falsch mache (im Moment scheint es der einzige Weg zu sein für mich, ich machs auf diese Weise)

Und hier "mein" Code der das was ich oben in Worten geschrieben habe abbildet. (Ich hab meine Methoden die hier nichts bringen gleich rausgenommen)


using System;
using System.Collections;
using System.Web.UI.WebControls;

public partial class DataSourceSample : System.Web.UI.UserControl
{
    private IList myDataSource;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack.Equals(false))
        {
            myDataSource = new ArrayList();
            ViewState["ListKey"] = myDataSource;
            GridView.DataSource = myDataSource;
            GridView.DataBind();
        }
    }
    protected void btnSave_Click(object sender, ButtonEventArgs e)
    {
        myDataSource = (IList)ViewState["ListKey"];
        myDataSource.Add("value");
        GridView.DataSource = myDataSource;
        GridView.DataBind();
    }
}

Wie gesagt
myDataSource = GridView.DataSource funzt net bei dynamischem setzen?!

Bin froh um euren Input.

If you can't make it, fake it.

L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 17 Jahren

Hab noch was rausgefunden;

Das DataSource setzen und binden muss nicht zwingend im PageIs=Postback geschehen, mir ist aufgefallen, wenn ich die DataSource nicht verändere oder so, so bleibt sie auf dem Control erhalten und muss nicht neu gesetzt und gebindet werden. (Bei Viewstate=enabled)
Mache ich eine Änderung an der DataSource, so verliert das Control diese DataSource (weiss nicht wieso, is leider einfach so !?).

Nur um Klarheit zu schaffen 😉

Gruss

If you can't make it, fake it.

A
154 Beiträge seit 2005
vor 17 Jahren

Darf man hier in deinen Grundlagen Thread Antworten geben? 😁

In der Tat finde ich die ViewState Eigenschaft bei den Datencontrols auch irreführend. Warum die Daten erhalten bleiben denke ich liegt darin, das die Controls die letztendlich die Daten darstellen diese behalten. Also die Labels und Textboxen oder Tabelle die das Datagrid zeichnet behalten ihre Werte über den Postback. Das Gridview selber hat keine Daten mehr.

Wobei das bei der Table ansonsten ja nicht funktioniert 🤔

.

L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 17 Jahren

Hi, klar dürft ihr Antworten 🙂 wäre sogar sehr erwünscht (falls ich in den ausführungen einen Fehler habe, hilft mir das).
Darum der "Sammel" thread.

@AlfameisterT
Mir geht es nicht direkt um die Viewstate Eigenschaft, sonder vielmehr darum warum sich eine Datasource relativ unterschiedlich verhalten kann.

z.B. zeigt mein Grid die Daten aus der Datasource nicht mehr an sobald ich einen Wert darin geändert habe. Aber ich denke, es wäre technisch relativ einfach lösbar die DataSource über den Postback hinweg zu erhalten und auch per Grid wieder anzuzeigen (bei änderungen, ohne das ich mich selbst um den Viewstate bemühen muss).

Schlussendlich ist das bischen Code hier doch eigentlich die pure "redundanz";


myDataSource = (IList)ViewState["ListKey"]; --> beim Load
ViewState["ListKey"] = myDataSource; --> beim Save

Oder schnall ich irgendwo was nicht?
Wieso kann ich nicht einfach "ViestateEnabled = true" und dann;


myDataSource = GridView.DataSource;

Das Grid soll die ja halten? Ist doch eigentlich nur ein Property wie jedes andere auch, egal ob bool string oder komplexer Typ Property ist Property.

Zusätzlich doof finde ich, dass ich die DataSource auch jedesmal neu binden muss (geht wahrscheinlich ins gleiche Problem) das wäre doch eigentlich auch nur "redundanz"?

Wenn jemand von euch jetzt sagt "au Mann" du musst das so und so machen damits klappt, bitte postet es 🙂

Gruss

If you can't make it, fake it.

A
154 Beiträge seit 2005
vor 17 Jahren

Wie schon geschrieben, der ViewState bezieht sich auf die Controls die das DataGrid erzeugt. Also die Labels und Textboxen usw.

Deshalb werden die Daten welche das GridView visualisiert, nach einem Postback wieder angezeigt, wenn du am GridView nichts machst.

Deshalb meinte ich ja, die Property und deren Bedeutung ist etwas irreführend.

L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 17 Jahren

Langsam verstehe ich was du meinst.

So wie ich dich vestehe, zieht das Grid alle Daten aus der DataSource, beim Bind() und stopft sie dann in die einzelnen Zellen/Controls.
Die DataSource wird verworfen. Die einzelnen Controls behalten ihren Zustand per Viewstate. (So hatte ich das Gefühl die DataSource "bleibt bestehen" obwohl es nur der Viewstate der einzelnen Controls war)

Darum muss ich es immer no binden, sooo ist das🙂

Danke für den Input, so habe ich mir das vorgestellt 😉

If you can't make it, fake it.