SharePointCommunity
Die deutschsprachige Community für SharePoint, Office 365 und mit Azure

Daten im Webpart halten

bewertet von 0 Usern
Nicht beantwortet Dieser Beitrag hat 0 Geprüfte Antworten | 10 Antworten | 2 Followers

Ohne Rang
Männlich
9 Beiträge
Rolf Schädlich erstellt in 10 Okt 2010 12:38

Hallo zusammen,

 

wie kann ich in einem Webpart am effektivsten Daten über ein Postback hinaus halten?

Gibt es andere Möglichkeiten außer Page.Cache.Insert und Page.Cache.Get?

Vielen Dank schon mal für eine Antwort.

Rolf.

Alle Antworten

Top-10-Beitragsschreiber
Männlich
18.168 Beiträge

ViewState

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
Männlich
9 Beiträge

Danke.

Gilt das auch, wenn ich nur Werte aus Textboxen und selektierte Items aus Dropdownlists speichern will?

Rolf.

Top-10-Beitragsschreiber
Männlich
18.168 Beiträge

Die brauchst Du gar nicht speichern, weil das die Controls selbst machen. Eingegebene Texte in Textboxen und die Auswahl von Selectboxen bleiben erhalten.

Viele Grüße
Andi
af @ evocom de
Blog
Top-10-Beitragsschreiber
Männlich
925 Beiträge

Es sei den die (neuen) Werte werden durch deine Programmierung wieder überschrieben z.B. Standardwerte sn der Falsche  stelle gesetzt (Asp.Net Life Cycle).

Ohne Rang
Männlich
9 Beiträge

Hallo Thomas,

danke für den Tipp.

Gibt es irgendwo ein gutes Beispiel für ein Webpart Lifecycle, wo ich auch sehe, in welcher Methode man am besten was macht?

Rolf.

Top-10-Beitragsschreiber
Männlich
18.168 Beiträge

Im Grunde ist das relativ einfach:

erzeuge die Controls in CreateChildControls. Setze ihre Initialwerte nur, wenn es kein Postback ist ( if (!Page.IsPostBack) ). Datenbindung macht man i.d.R. in OnPreRender.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
Männlich
9 Beiträge

Sorry, aber wahrscheinlich stelle ich mich zu dumm an...

Beispiel:

 

<DefaultProperty("Text"), _
ParseChildren(True), PersistChildren(False), _
ToolboxData("<{0}:MessedatenDeutschland runat=server></{0}:MessedatenDeutschland>")> _
Public Class MessedatenDeutschland
    Inherits UserControl
    Implements IPostBackDataHandler
    Implements IPostBackEventHandler 
    Implements IRequiresSessionState
    Implements ITemplate
...
Private txtTest As TextBox
...
Protected Overrides Sub CreateChildControls()
MyBase.CreateChildControls()
txtTest = New TextBox
txtTest.ID = "txtTest"
Controls.Add(txtTest)
 If Not Page.IsPostBack Then
            '=== erstes mal
            txtTest.Text = "1"
        Else
            '=== folgend
            txtTest.Text = "2"
End If
...

ist jetzt ein Postback, wird das Control neu instanziiert (der Initialwert also weg), obwohl CreateChildControls doch eigentlich prüfen sollte, ob die Controls schon erzeugt sind... oder?

Rolf

 

Top-10-Beitragsschreiber
Männlich
18.168 Beiträge

Ich dachte Du hättest ein Webpart. Der Code ist aber ein UserControl.

Nimm mal die ganzen Implements weg. Die brauchst Du nicht, weil das die Basisklasse UserControl bereits für Dich erledigt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
Männlich
9 Beiträge

sorry, hatte ich vergessen zu erwähnen.

ohne Implements hat sich aber auch nichts geändert.

Hier ist das Webpart, das das UserControl einbindet:

 

using System.Runtime.InteropServices;
using System.Web.UI;

using System.Web.UI.WebControls.WebParts;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebPartPages;
using Auma.SharePoint.Internet.MessedatenDeutschland;
 
namespace Auma.SharePoint.Internet.Controls.WebParts
 
{
    [Guid("39A619D4-69CA-4115-AE5A-832F5421498E")]
    public class MessedatenDeutschlandWebPart : System.Web.UI.WebControls.WebParts.WebPart
    {
 
        private string _responseString = "URL für MessedatenListe";
 
        protected override void CreateChildControls()
        {
 
            UserControl messedatenDeutschland = new MessedatenDeutschland.MessedatenDeutschland() ;
            Controls.Add(messedatenDeutschland);
        }
 
        [WebBrowsable(true), Personalizable(PersonalizationScope.Shared), SPWebCategoryName("Auma"),

       WebDisplayName("Url"), WebDescription("Text To Show")]

        public string ResponseString { get { return _responseString; } set { _responseString = value; } }

    }
}

 

Top-10-Beitragsschreiber
Männlich
18.168 Beiträge

D.h. die eigentliche Oberfläche wird durch das UserControl (und nicht durch das Webpart) bereitgestellt. In UserControls ist die Vorgehensweise eine ganz andere.

Dort erzuegst man die Oberfläche normalerweise über den grafischen Designer, der dann die ascx-Datei befüllt. Code dazu kommt in die CodeBehind ascx.vb-Datei. Damit werden die Controls bereits in der ascx erzeugt und im Code nur noch referenziert:

ascx; <asp:TextBox id="textBox" runat="server"/>
ascx.vb: Protected textBox As TextBox

Man legt einfach eine Protected-Variable mit dem Namen an, der als id in der ascx steht und fertig.

Viele Grüße
Andi
af @ evocom de
Blog
Seite 1 von 1 (11 Elemente) | RSS