wtorek, 28 października 2008

Gotowiec: Mega prosta ankieta w 2 minuty

Niedawno zostałem poproszony przez mojego kolegę, czy nie mógłbym mu stworzyć prostej ankiety? I tak oto w ciągu 1 minuty, 40 sekund powstała mega prosta ankietka, opierająca swoją konfigurację o plik Web.config - to tutaj definiowane są pytania i odpowiedzi na nie. Z tego względu, że często można przeczytać prośby początkujących o podobne rozwiązania postanowiłem tu niniejszy projekt umieścić. Zastrzegam, rozwiązania ma swoje wady, jednak w niecałe dwie minuty nie da się wszystkiego dorobić :-)

Strona Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="pnlSurvey" runat="server">
<asp:Label ID="lblQuestion" runat="server" />
<asp:Repeater ID="rptAnswers" runat="server"
onitemdatabound="rptAnswers_ItemDataBound">
<HeaderTemplate>
<h3>Możliwe odpowiedzi:</h3>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chckAnswer" runat="server" /><br />
</ItemTemplate>
</asp:Repeater>
</asp:Panel>
<asp:Button ID="btnNext" runat="server" Text="Dalej >>" onclick="btnNext_Click"
Visible="False" />
<br /> <asp:HyperLink ID="HyperLink1" runat="server"
NavigateUrl="Default.aspx?QuestionNo=0">Początek ankiety</asp:HyperLink>
</div>
</form>
</body>
</html>


Kod strony Default.aspx.cs
using System;
using System.Configuration;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
public string[] Questions
{
get
{
if (ConfigurationManager.AppSettings["Questions"] != null)
{
return ConfigurationManager.AppSettings["Questions"].ToString().Split(';');
}
return new string[] { };
}
}

public int ActualQuestionNo
{
get
{
if (Request.QueryString["QuestionNo"] != null)
return Convert.ToInt32(Request.QueryString["QuestionNo"]);
return -1;
}
}

protected void Page_Load(object sender, EventArgs e)
{
if (ActualQuestionNo >= 0)
{
PrepareAnswers(PrepareQuestion());
btnNext.Visible = true;
}
}

private void PrepareAnswers(int p)
{
if (ConfigurationManager.AppSettings["Answers"] != null)
{
string[] answers = ConfigurationManager.AppSettings["Answers"].ToString().Split(';');
if (p < answers.Length)
{
string[] anwersQ = answers[p].Split(',');
if (anwersQ.Length >= 1)
{
rptAnswers.DataSource = anwersQ;
rptAnswers.DataBind();
}
}
}
}

private int PrepareQuestion()
{
int questionNo = ActualQuestionNo;
if (questionNo >=0)
{
if (questionNo <= Questions.Length -1 )
lblQuestion.Text = Questions[questionNo];
}

return questionNo;
}


protected void rptAnswers_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
CheckBox chck = e.Item.FindControl("chckAnswer") as CheckBox;
if (chck != null)
chck.Text = e.Item.DataItem as string;
}
}
protected void btnNext_Click(object sender, EventArgs e)
{
if (ActualQuestionNo >= 0)
{
if (ActualQuestionNo < Questions.Length - 1)
{
//Zachowaj Odpowiedz
int toQuestion = ActualQuestionNo + 1;
Response.Redirect(string.Format("Default.aspx?QuestionNo={0}", toQuestion));
}
else
Response.Redirect("SurveyEnd.aspx");
}
}


}


Do Web.config-a należy dodać następujące wpisy:
    <appSettings>
<add key="Questions" value="Jakie masz ulubione danie?; Jakie lubisz marki samochodów?; Twoje zainteresowania"/>
<add key="Answers" value="Pizza, Gołąbki, Schabowy; Alfa Romeo, Audi, Fiat, Porshe; IT, Film, Muzyka"/>
</appSettings>


Tada!! Ankieta gotowa!!
Niech kod będzie za Wami!

0 komentarze: