SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




WebPart + ButtonEvent

Unbeantwortet Dieser Beitrag hat 13 Antworten

Ohne Rang
115 Beiträge
A C erstellt 28 Sept. 2010 12:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

ich habe ein WebPart in VS erstellt und möchte mit hilfe von 2 Buttons Werte in TextFeldern erhöhen bzw. verringern, jedoch funktioniert das ganze nur immer um einen Wert vom Initialwert.

Die Initwerte und das Ersellen der TextFelder, Buttons usw. erfolgt bei:

protected override void CreateChildControls(){ ... }

ist das richtig oder an welcher Stelle bring ich den Initialwert unter oder was macht ich falsch?

Habt ihr vielleicht ein Beispiel ?

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Sept. 2010 13:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist an der richtigen Stelle, aber Du solltest vor dem Setzen der Initialwerte auf Postback prüfen:

if (!this.Page.IsPostBack) {
 // setze Initialwert
}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 28 Sept. 2010 13:41
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, soweit so gut, aber an welcher Stelle, kann ich eine Variable anlegen, die nicht bei jedem "Reload" überschrieben wird, also eine ganz einfache Var zum speichern des letzten wertes...

 

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Sept. 2010 13:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Den Wert kannst Du doch aus dem Control (Textbox?) selbst auslesen?

Ansonsten kannst Du im ViewState Werte zwischenspeichern. Lege Dir dazu am Einfachsten eine private Eigenschaft an:

private string MyValue {
 get { return ViewState["MyValue"]; }
 set { ViewState["MyValue"] = value; }
}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 28 Sept. 2010 14:21
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Super, danke, das mit ViewState ist genau das was ich suchte.

Aber ich hab noch ein Problem, ich habe eine Tabelle mit mehreren DropDownListen, welche alle mit den Elementen eine Liste gefüllt sind, aber nicht alle sollen den selben "SelectedIndex" haben, wenn ich versuche diesen zu setzen, dann bezieht sich der Wert der letzten DDL auf alle. Das ist schon ziemlich verwirrent, da alle DDL's unterschiedliche Namen haben...

:(

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Sept. 2010 14:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie erzeugst Du die Tabelle mit den DDLs und wie setzt Du den SelectedIndex?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 28 Sept. 2010 15:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Die Tabelle erzeuge ich mit bei

CreateChildControls(){

Control control = Page.LoadControl(_ascxPath);

Controls.Add(control);

Table t = (Table)createMyTable();

this.Controls.Add(t);

}

 

createMyTable(){

Table t;

TableRow tr;

TableCell tc;

....

myDdl1.SelectedIndex = 5;

myDdl2.SelectedIndex = 2;

}

es wir für alle DDLs der Index = 2 als default angezeigt :(

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Sept. 2010 15:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Haben die DDLs auch alle eine eindeutige ID?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 28 Sept. 2010 15:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hmm... genau gesagt, bin ich mir da jetzt unsicher, aber ich erstelle jedes einzelne neu.

 

 

 

 

public class VisualWebPart1 :

WebPart

{

 

 

 

protected DropDownList

 myDdl1;

 

 

protected override void CreateChildControls()

{

 

 

Control control = Page.LoadControl(_ascxPath);

Controls.Add(control);

 

 

//----------------------------------------------

 

 

Table t = (Table)CreateTable();

 

 

this.Controls.Add(t);

 

}

 

 

private Object CreateTable()

{

 

 

ListItemCollection liC = new ListItemCollection();

liC.Add(

 

new ListItem("Test 1"));

liC.Add(

 

new ListItem("Test 2"));

liC.Add(

 

new ListItem("Test 3"));

 

 

myDdl1

 

= new DropDownList();

for (Int16 i = 0; i < liC.Count - 1; i++)

{

myDdl1.Items.Add(liC[i]);

myDdl2.Items.Add(liC[i]);

}

myDdl1.SelectedIndex = 2;

}

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 28 Sept. 2010 16:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Brrr, könntest Du bitte den Code in eine lesbare Form bringen? Danke.

Man kann aber trotzdem erkennen, daß Du der DDL gar keine ID gibst (myDdl1.ID = "EtwasEindeutiges";). Das würde ich zuerst versuchen. Und wie bei den Initialwerten: die DDLs nur Füllen und SelectedIndex setzen, wenn es kein PostBack ist.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 29 Sept. 2010 12:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, hab beim copy/paste nicht weiter auf die Formatierungen hier geachtet :(

Habe jetzt auch jeder DropDownList eine ID verpasst, muss ich beim zuweisen des Wertes die ID mit angeben? Wenn ja wie ?

[quote]

public class VisualWebPart1 : WebPart

{

protected DropDownList myDdl1; 

 

{

Control control = Page.LoadControl(_ascxPath);

Table t = (Table)CreateTable();  

this.Controls.Add(t);  

private Object CreateTable()

{

ListItemCollection liC = new ListItemCollection(); new ListItem("Test 1"));

liC.Add(

liC.Add(new ListItem("Test 2"));

liC.Add(new ListItem("Test 3")); 

= new DropDownList();

myDdl1

for (Int16 i = 0; i < liC.Count - 1; i++)

 

{

myDdl1.Items.Add(liC[i]);

myDdl2.Items.Add(liC[i]);

}

myDdl1.SelectedIndex = 2;

}

}

Controls.Add(control);

protected override void CreateChildControls()

 

[/quote]

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Sept. 2010 13:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

In Deinem Code fehlt zuviel. So läßt sich der Zusammenhang nicht erkennen.

Mich würde interessieren, warum Du ein ascx lädst und dann noch zusätzliche Controls erzeugst. Normalerweise macht man entweder das eine oder das andere.

Kleiner Tip zum Codeeinfügen: kopiere den Code aus Visual Studio zuerst nach Notepad (oder einen anderen Plain-Text Editor) und erst dann hier ins Forum. Dabei geht zwar das Syntax-Highlighting verloren, aber es läßt sich trotzdem besser lesen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
115 Beiträge
A C Als Antwort am 29 Sept. 2010 14:36
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo, ich hoff nun, dass es besser zu lesen geht.

Auf die Frage warum ich es auf diese Art gemacht habe, kann ich nur antworten, dass ich es nicht besser weiß und ein Newbie in Webpart-Entwicklung bin.

Ich wollte einfach ein paar Eingabe Felder in diesem Webpart, welche ich anschließend validieren kann und dann ggf. die Daten wieder in einer Liste speichern.

Das zugreifen auf Listen (lesend und schreibend) bekomm ich hin. Aber an dieser Geschichte bin ich zZ. gescheitert

:(

leider, komm mir inzwischen schon ganz schön blöd vor ...

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Drawing;
using System.Globalization;


namespace CardWebPart.VisualWebPart1
{
    [ToolboxItemAttribute(false)]
    public class VisualWebPart1 : WebPart
    {
        // Der Pfad wird unter Umständen automatisch aktualisiert, wenn das Visual WebPart-Projektelement geändert wird.
        private const string _ascxPath = @"~/_CONTROLTEMPLATES/TimeCardWebPart/VisualWebPart1/VisualWebPart1UserControl.ascx";
       
        private DateTime dTemp;       
               
        protected DropDownList ddlDayTypeMo;       
 protected DropDownList ddlDayTypeDi;       
 protected DropDownList ddlDayTypeMi;       
 protected DropDownList ddlDayTypeDo;       
 protected DropDownList ddlDayTypeFr;       
 protected DropDownList ddlDayTypeSa;       
 protected DropDownList ddlDayTypeSo;       

        protected Button btnCheck;
        protected Button btnSend;
        protected Button btnBack;
        protected Button btnVor;

        protected override void OnLoad(EventArgs e)
        {
           
            base.OnLoad(e);
        }

        protected override void CreateChildControls()
        {
            Control control = Page.LoadControl(_ascxPath);
            Controls.Add(control); 
            //----------------------------------------------
            Table t = (Table)CreateTable();        
            this.Controls.Add(t);
          
        }

        private Object CreateTable()
        {
            ListItemCollection liC = new ListItemCollection();
            liC.Add(new ListItem("Anwesend"));
            liC.Add(new ListItem("Abwesend"));

            ddlDayTypeMo = new DropDownList();
            ddlDayTypeMo.ID = "ddlDayTypeMo";
            ddlDayTypeDi = new DropDownList();
            ddlDayTypeDi.ID = "ddlDayTypeDi";
     
            for (Int16 i = 0; i < liC.Count - 1; i++)
            {
                ddlDayTypeMo.Items.Add(liC[i]);
                ddlDayTypeDi.Items.Add(liC[i]);
            }

            ddlDayTypeMo.SelectedIndex = 1;
            ddlDayTypeDi.SelectedIndex = 1;

            btnCheck = new Button();
            btnCheck.Text = "prüfen";
            btnSend = new Button();
            btnSend.Text = "speichern";
            btnSend.Enabled = false;

            Table t;
            TableRow tr;
            TableCell tc;

            t = new Table();

            tr = new TableRow();
            tc = new TableCell();
            Label lblMo = new Label();
            lblMo.Width = 90;
            lblMo.Text = "Montag  ";
            tc.Controls.Add(lblMo);
            tc.Controls.Add(ddlDayTypeMo);
            tr.Controls.Add(tc);
            t.Controls.Add(tr);

            tr = new TableRow();
            tc = new TableCell();
            Label lblDi = new Label();
            lblDi.Width = 90;
            lblDi.Text = "Dienstag ";
            tc.Controls.Add(lblDi);
            tc.Controls.Add(ddlDayTypeDi);
            tr.Controls.Add(tc);
            t.Controls.Add(tr);

            return t;
        }
    }
}

Aus der Ferne betrachtet, sieht alles ganz anders aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 29 Sept. 2010 15:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, immerhin kann man den Code jetzt lesen :-)

Die Funktion CreateTable wird bei jedem PostBack aufgerufen. Dort erzeugst Du jedesmal die Controls (richtig) und Du befüllst sie jedesmal und setzt den SelectedIndex (falsch). Damit kann der Benutzer machen was er will, Du setzt in jedem Fall die Auswahl wieder zurück. Wie man das verhindert, habe ich Dir oben schon gezeigt ( if (!Page.IsPostBack)

zu Deinem ursprünglichen Problem, daß die SelectedIndex bei beiden DDLs gleich sind: Du befüllst beide mit denselben ListItems. ListItem ist ein Referenztyp und damit in beiden DDLs identisch. Wenn man DropDownList.SelectedIndex setzt, dann wird intern beim entsprechenden ListItem die Eigenschaft Selected auf true gesetzt. Weil die ListItem's in den DDLs identisch sind, gilt das dann für alle DDLs.

Zu dem ascx: das LoadControl kannst Du rausschmeißen, wenn dort eh nichts drinsteht. Man erzeugt die Controls entweder im ascx (mit grafischem Designer) oder (wie Du, ohne Designer) in CreateChildControls.

Viele Grüße
Andi
af @ evocom de
Blog