Avatar billede morschmidt Nybegynder
29. september 2004 - 09:41 Der er 17 kommentarer og
1 løsning

WebPart (SPS 2003) med dynamiske controls, STORT problem

Hej
Jeg har nu i et stykke tid bøvlet med at få lavet en WebPart til SPS 2003, jeg benytter VB.net til at udvikle den i, jeg har faktisk fået lavet en vel fungerende WebPart men mit problem er følgende.

Min ene WebPart består øverst af en Menu
- New Task | My Tasks

New Task benyttes til at oprette nye opgaver og My Tasks gør det muligt at se opgaver man har sendt.
Jeg benytter mig af Session cookies til at gemme hvilken side en person kigger på. Mit første problem er nu følgende:
Som jeg ser WebParts og controls som skal have en function, skal disse initialiseres i CreateChildControls, problemet herved er at første gang en person trykker på New Task, laver den en postBack og jeg vil så gerne have den til at skifte side til New Task siden, og derved loade andre controls end dem på My Tasks siden. Problemet er nu at CreateChildControls bliver eksikveret før onClick eventet bliver aktiveret og derved at siden finder ud af hvilken sider jeg står på.

Samtidig har jeg også et andet problem:
Jeg har en comboBox som henter dens data fra en database, når man vælger noget i denne comboBox laver den et PostBack og fylder ny information ind i comboBoxen osv (ComboBoxen repræsentere egentlig et Træ), problemet er nu igen, hvordan finder jeg ud af hvad der er blevet trykket når jeg står i CreateChildControls metoden ???

I øjeblikket vil CreateChildControls metoden stadig tro at den gamle værdi er valgt, og hvis jeg venter med at hente information ind i comboBoxen til eventet er blevet aktiveret virker ComboBoxen ikke da den ikke blev defineret med værdier i CreateChildControls metoden
Avatar billede snepnet Nybegynder
29. september 2004 - 19:15 #1
objekterne skal instantieres på serveren før du kan få noget ud af dem... hvis du har tilføjet kontroller dynamisk, er der ikke noget automatik der sørger for at de instantieres efter et postback, du skal derfor gøre det selv.
(altså... du skal sørge for at de findes - inden du kan opsnappe events fra dem. det fremgår af det du skriver, at det er i CreateChildControls du laver dem... den metode skal altså være kørt inden det kan komme på tale at håndtere events fra de kontroller du sætter ind).

hvis opbygningen af din side er afhængig af hvad en bruger har trykket på (på samme side), vil du derfor være nødt til f.eks. at skabe siden i createchildcontrols, og derefter modulere den afhængig af det event du fanger.

du kan desuden arbejde med IsPostBack ved f.eks. :
if(!this.Page.IsPostback)
{
  // første gang siden vises
}
else
{
  // ved hvert postback
}

hvad dropdownlisten (og mange andre tilsvarende kontroller angår) :
det at det er nødvendigt at instantiere de dynamisk indsatte kontroller på serveren efter et postback betyder ikke at du skal retablerer hele kontrollen med indhold osv.

typisk vil du gøre noget i stil med :

protected DropDownList ddList;

// et pasende sted :
ddList = new DropDownList();
this.Controls.Add(ddList);

if(!IsPostBack)
{
  ddList.DataSource = someSource;
  ddList.DataBind();
}

og i en handler af selectionchange, vil du så sørge for at loade ny data ind i listen (hvis det var det du mente med den repræsenterede et træ) - og efterfølgende databinde igen.

hmmm... det blev vist tåget... jeg vil gerne give dig nogle eksempler, men det ville være fitn hvis du smed lidt af din kode herud - så skal jeg nok give et bud på det.

mvh

...

(der findes en relateret 3-parts løsning her : http://www.denisbauer.com/ASPNETControls/DynamicControlsPlaceholder.aspx)

Du kan også kigge lidt her... der er muligvis lidt inspiration.
http://eksperten.dk/spm/519579
Avatar billede morschmidt Nybegynder
30. september 2004 - 09:15 #2
Okay takker mange gange men har dog lidt svært ved at forstå hvad du mener, første gang jeg programmere .asp , normalt programmere jeg kun c++, vb og php.
Nå men her er koden ihvertfald:
http://www.scoding.dk/WebPart1.asps

husk det er VB.net kode og der er en masse objekter der blever refereret til og det virker alt sammen fint, med undtagelse af disse dobbelte callbacks eller hvad man skal kalde det.
Avatar billede snepnet Nybegynder
01. oktober 2004 - 20:12 #3
hov... havde ikke set du havde skrevet igen.
jeg kigger på det.
Avatar billede snepnet Nybegynder
02. oktober 2004 - 01:18 #4
Det er jo et temmelig digert værk du har der.... Jeg tror du kunne have glæde af at bryde tingene en smule op, men pyt nu med det.

Med hensyn til din DropDownList, så er det det jeg skrev omkring databinding du skal kigge på.

Du skal ikke databinde hver gang.... kun første gang, og ved ændringer i datagrundlaget.
Din dropdownlist skal nok huske indholdet, og det sidst valgte.

Derfor :
// insert dropdownlist
If Not IsPostBack Then
  // her sørger du for at databinde din dropdownboks
End If

Den skal sættes ind uanset hvad - men du skal kun hælde data ind når det er nødvendigt.
og hvis det er en selection_change i dropdownlisten der ændrer datagrundlaget, er det først i den handler du sørger for at hante data, og kalde databinding på dropdownboksen igen.

er det forståeligt ... ellers må du lige sige til.

hvis du kan få ovenstående til at fungere kan vi kigge på det andet bagefter.

mvh
Avatar billede morschmidt Nybegynder
04. oktober 2004 - 09:33 #5
Hej, jeg har prøvet meget simpelt at tilføje dette
        If Not Page.IsPostBack Then
            cmb_priority.Items.Add("Low")
            cmb_priority.Items.Add("Medium")
            cmb_priority.Items.Add("High")
        End If
Dette resultere i at ved første load er der information i cmb_priority men når der laves postBacks er den tom... Objektet instantieres globalt
Private cmb_priority As New System.Web.UI.WebControls.DropDownList
Og bliver stoppet ind i en tabel under CreateChildControls - createNewForm

Har du nogen ide hvorfor dette ikke virker ?
Avatar billede snepnet Nybegynder
04. oktober 2004 - 18:04 #6
jeg vil tro at du har slået viewstate fra .... har du det ?
mvh
Avatar billede morschmidt Nybegynder
05. oktober 2004 - 08:56 #7
har tilføjet dette før controls tilføjes, resultere stadig i det samme...

me.EnableViewState
cmb_priority.EnableViewState = True
Avatar billede snepnet Nybegynder
05. oktober 2004 - 15:24 #8
har du prøvet at lave det på en "almindelige" webform ?
(altså ikke som del af en webpart)
Avatar billede morschmidt Nybegynder
05. oktober 2004 - 16:10 #9
Nej har jeg ikke men skal jeg heller ikke bruge til noget
Avatar billede snepnet Nybegynder
05. oktober 2004 - 18:16 #10
:o) - fair nok.
Spørgsmålet var nok også ment som et spørgsmål om hvorvidt det var noget du havde haft "oppe under neglene" tidligere.
Normalt vil der - når du smider kontrol som en dropdownlist - ud til en klient blive lagt information i viewstate som er tilstrækkeligt til at retablere kontrollens tilstand på serveren, hvilket så igen resultere i at kontrollen kan renderes som forventet til klienten jf. det eksempel jeg skrev 29/09-2004 19:15:25.

Men.... jeg har lidt prøvet at se om jeg kunne finde nogle generelle forskelle fra når man laver "almindelige" customcontrols, og når man laver webparts, hvilket der er.

På denne side :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_SP2003_ta/html/sharepoint_northwindwebparts.asp

Bliver lidt forskellige forhold behandlet, og en dropdownlist i forhold til viewstate er et eksempel, og der ser ud til at være en hel del gode ting på siden.

Adding Child Controls to Web Parts - er et af flere interesante afsnit, hvor der bl.a. er beksrevet forhold omkring viewstate og IsPostBack i forhold til webparts.

mvh
Avatar billede snepnet Nybegynder
09. oktober 2004 - 15:32 #11
hej morschmidt :o)
jeg smider et svar her, hvis du kunne bruge noget af det til noget... Ellers må du sige til.
mvh - og held og lykke med det.
Avatar billede snepnet Nybegynder
09. oktober 2004 - 15:33 #12
Nå men jeg prøver da lige igen ;o)
Avatar billede morschmidt Nybegynder
11. oktober 2004 - 10:13 #13
JA fandt ud af det, det havde noget med indholdet i comboboxen at gøre, jeg fylder nu information i comboboxen ved OnPreRender, jeg siger tak. Du nævnte dog tidligere
"Det er jo et temmelig digert værk du har der.... Jeg tror du kunne have glæde af at bryde tingene en smule op, men pyt nu med det." <---

Kan du give nogle eksempler ?
Avatar billede snepnet Nybegynder
17. oktober 2004 - 00:25 #14
hej igen :o)
jeg har lige været væk i nogle dage... vil du stadig gerne have nogle eksempler ?
mvh
Avatar billede morschmidt Nybegynder
17. oktober 2004 - 11:23 #15
Ja hvis du mener der kan gøres mere struktureret så meget gerne...
Avatar billede snepnet Nybegynder
19. oktober 2004 - 23:19 #16
crap... jeg havde helt glemt dig - det er jeg ked af :o( - undskyld.

har du mulighed for at lægge et billede op af siden ? (så er det lidt nemmere at forholde sig til end når man bare sidder og kigger på alle vb-linjerne :o)

men ellers ville jeg foreslå at tilgå sessionvariable lidt mere entydigt - f.eks. ved brug af properties sådan her :

til afløser for flere steder i koden at have en :

context.Session("chosenHelpdesk")
hvor man guffer en variabel på en string - som skal skrives rigtigt, kan der laves et enkelt sted, hvor du navngiver sessionvariablen pr. string (hvor der så kan bygges nødvendig null-sikring ol. ind).

Protected Property ChosenHelpDesk() As HelpDesk
Get
  Return CType(context.Session("ChosenHelpDesk"), HelpDesk)
End Get
Set
  context.Session("ChosenHelpDesk") = value
End Set
End Property

Så kan man tilgå den via den hver gang.

Der ligger også en del tabelgenereringskode, som giver nogle lidt lange metoder... Der tror jeg, at jeg selv ville vælge at lave en lille hjælpe-klasse til tabelgenereringen.
Der kunne måske være andere steder hvor en sådan hjælpeklasse kunne være rar at have, og jeg ville nok prøve at finde på en der kunne hjælpe med at fjerne de nestede "iffer" der er i nogle af metoderne.

Desuden kunne man afløse sådan en som den her :
context.Session("submitError")
med en lidt mere sigende metode i klassen som
PersistSubmissionError("Fejlmeddelelse")

Der kunne også laves adgang til styles via en style-klasse måske... Altså en klasse som så kunne være det eneste sted man navngav styles - f.eks. sådan her :

public class Styles
{
  public static string MicrosoftToolBar
  {
    get{return "ms-toolbar";}
  }

  public static string SuperDuperButton
  {
    get{return "superduperbutton";}
  }
}

hov - det blev C# (håber det går - det er bare et par properties ligesom den tidligere).

Det giver et lille overhead i koden, men til gengæld er der så kun ét eneste sted hvor man skal holde styr på de strings som kompileren ikke kan hjælpe med at finde fejl i (altså lidt af de samme årsager som det med sessionvariablene).

Det var bare lige et par småting... du kan jo se om der er noget af det du kan bruge - ellers kan du jo bare ryste på hovedet :o)
(man kan jo altid blive ved med den slags, men meget af det er jo ret afhængig af hvordan man selv arbejder mest effektivt - og der er jo sjældent nogle der betaler for at man sidder og forfiner sine koder i flere dage :o)

Håber din webpart spiller :o)
mvh
Avatar billede morschmidt Nybegynder
20. oktober 2004 - 12:57 #17
Meget fede ideer, havde jeg slet ikke tænkt over...
Genialt... takker endnu en gang mange gange
Avatar billede snepnet Nybegynder
20. oktober 2004 - 20:18 #18
var så lidt :o)
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester