Avatar billede carparknorth Nybegynder
13. januar 2006 - 10:17 Der er 3 kommentarer og
1 løsning

Survey - Dynamic creation

Hey.

Jeg er godt i gang med at lave et survey system. Det går egentlig meget godt. Formålet med systemet er selvfølgelig at lave et survey/undersøgelses-system, hvor det faktisk bare er at oprette en survey i databasen og så vil systemet selv rendere alle de forskellige controls, der nu er valgt. Jeg har lavet administrationsinterfacet, dvs. brugerne kan nu definere nye typer af spørgsmål, altså om spørgsmålet er textspørgsmål, radiobuttonlist eller hvad de nu skal være. Disse data bliver så smidt ned i min database. Jeg har altså typen på spørgsmålet i min database.

Så til mit spørgsmål. Hvordan renderer jeg disse data? Jeg har lavet en oversigtsside, hvor brugeren kan se hvilke surveys vedkommende har adgang til. Det er ikke noget problem, men når brugeren så klikker sig ind på denne survey kommer problemet.

Jeg håber på at få hjælp til fx at lave mine egne controls? Jeg ved ikke om det måden at gøre det på? Det skal være sådan, at hvis der fx står radiobuttonlist i databasen, så skal systemet vælge en klasse/control/andet, der så renderer det rigtige, at en række radiobuttons. Havde stået textbox i databasen, skulle systemet så have valgt klassen/controlleren/andet (hvad det hedder??) skulle systemet så rendere en textbox. Der er selvfølgelig flere spørgsmål på en survey.

På forhånd tak for hjælpen.
Avatar billede snepnet Nybegynder
14. januar 2006 - 15:26 #1
mmm... det er et stort spørgsmål, med mange mulige svar.

hvis du arbejder udfra, at en servey kan have 1 til flere spørgsmål, og et spørgsmål har en slags "svarmulighedstype", så har du jo forskellige muligheder.

// hvis vi nøjes med at holde os til Survey, og SurveyQuestion.
jeg ville nok selv lave tilsvarende kontroller, således at du havde en ServeyControl og en SurveyQuestionControl, hvor en SurveyControl self. skulle kunne holde 0..n ServeyQuestionControl's

mht. til hvordan du får en type angivet i database til at blive til en kontrol i et ui, så har du nok grundlæggende to forskellige modeller at gå ud fra.
den ene - den sådan lidt lavpraktiske - ville være, at du blot kigger på hvad der kommer op fra basen, og i en switch opretter den kontrol der er behov for - et lille udsnit af klassen kunne måske være noget i denne stil:

public class SurveyQuestionControl : <Base afhængig af den frameworkversion du bruger>
{
  public SurveyQuestion{get{...};set{...}}
 
  public SurveyQuestionControl(SurveyQuestion surveyQuestion){...}

  void CreateControls()
  {
    Debug.Assert(SurveyQuestion != null);
    ...
    switch(SurveyQuestion.AnswerType.ToUpper())
    {
      case "TEXT" :
      {
        Controls.Add(new TextBox());
      }
      case "LIST"
      {
        string[] options = SurveyQuestion.Options;
        RadioButtonList list = new RadioButtonList();
        foreach(string option in options)
        {
          list.Items.Add(new ListItem(option));
        }
        Controls.Add(
      }
      case ...
      .
      .
      default :
        throw new ApplicationException(...);
    }
    ...
  }
}

læg mærke til, at der et ekstra abstraktionsniveau - forstået på en måde, at du i databasen angiver et typenavn for hvordan spørgsmålet skal kunne besvares, og at du i koden definerer hvilket kontrol det så medfører i ui'et.

en lidt mere avanceret - og potentielt fleksibel - løsning kunne være, at du angiver den specifikke type i databasen, og loader den runtime med noget i denne stil:

// typename skal du så have fra databasen
string typename = "System.Web.UI.WebControls.TextBox, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
Type type = Type.GetType(typename);
Control control = Activator.CreateInstance(type) as Control;
Controls.Add(control);

på den måde vil du sådan set kunne proppe kontroller ind i et kontroltræ uden at ane hvad det er for nogle, men det vil som udgangspunkt nok ikke være særlig brugbart, da du formentlig skal arbejde direkte på de enkelte kontroller andre steder i koden (du skal f.eks. benytte .Text på en TextBox og måske SelectedItem på en DropDownList etc).

hvis du forventer at du har tilstrækkelige muligheder med de medfølgende kontroller, synes jeg godt du kan forsvare at lave implementering med switch'en eller lignende mekanisme.

hvis du forventer at du skal kunne tilbyde brugeren at besvare på enhver tænkelig/utænkelig (og måske pt. ukendt måde) - så kan det godt være at du med fordel kunne skrue lige mere op for blusset, og f.eks. basere din løsning mere på interfaces, således at du sådan set kunne tilbyde enhver svarmulighedstype - med det krav at kontrollen der benyttes implementerer et specifikt interface - f.eks. noget i denne stil:

public interface IAnswerControl
{
  string GetAnswer();
}

og for alle de kontroller du ville bruge som svarkontrollen ville du så skulle lave din egen implementering:

public class TextBoxAnswer : TextBox, IAnswerControl
{
  // implementering af interface
  public string GetAnswer()
  {
    return this.Text;
  }
}

og det ville så give dig en mulighed for denne (som kunne være generel):

public class SurveyQuestionControl : <base afh. af frameworkversion>
{
  privat IAnswerControl _answer;
  public IAnswerControl Answer
  {
    get{return _answer;}
  }

  public SurveyQuestionControl(SurveyQuestion question)
  {
    Type answertype = Type.GetType(_question.AnswerTypeName);
    _answer = Activator.CreateInstance(type) as IAnswer;
    Controls.Add(answer as Control);
  }
}

på den måde vil du udefra kunne sådan noget her i sidste ende:

string someAnswer = someSurvey.Questions[3].GetAnswer();
fuldstændig uafhængigt af den kontrol der aktuelt benyttes som svarkontrol.

.... nåh.... det bare bare sådan lidt strøtanke-pladder, men det kan være vi kan komme frem til noget lidt mere konkret hvis du hjælper lidt på vej.

mvh
Avatar billede snepnet Nybegynder
28. januar 2006 - 17:34 #2
hvordan går det her?
mvh
Avatar billede carparknorth Nybegynder
29. maj 2006 - 21:01 #3
takker for hjælpen. læg et svar
Avatar billede snepnet Nybegynder
30. maj 2006 - 00:17 #4
Kommer her :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