Avatar billede shadowdance Nybegynder
07. februar 2006 - 16:56 Der er 2 kommentarer og
1 løsning

Initialisere user controls

Hejsa,

jeg har haft dette problem før, men jeg har lige svært ved at tackle det hver gang. Måske fordi jeg ikke helt forstår rækkefølgen af events...

Jeg har lavet en user control, der består af tre dropdown lists, en med dag, måned og år. Man kan altså vælge en dato. I .ascx filen har jeg:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Not Page.IsPostBack Then
            For i As Integer = 1 To 31
                day.Items.Add(New ListItem(i & ".", i))
            Next

            month.Items.Add(New ListItem("januar", 1))
            month.Items.Add(New ListItem("februar", 2))
            month.Items.Add(New ListItem("marts", 3))
            month.Items.Add(New ListItem("april", 4))
            month.Items.Add(New ListItem("maj", 5))
            month.Items.Add(New ListItem("juni", 6))
            month.Items.Add(New ListItem("juli", 7))
            month.Items.Add(New ListItem("august", 8))
            month.Items.Add(New ListItem("september", 9))
            month.Items.Add(New ListItem("oktober", 10))
            month.Items.Add(New ListItem("november", 11))
            month.Items.Add(New ListItem("december", 12))

            For i As Integer = DateTime.Now.Year - 100 To DateTime.Now.Year
                year.Items.Add(New ListItem(i, i))
            Next
        End If
    End Sub

    Public Sub setDate(ByVal todate As DateTime)

        day.SelectedValue = todate.Day
        HttpContext.Current.Trace.Write(todate.Day)
        month.SelectedValue = todate.Month
        year.SelectedValue = todate.Year

    End Sub

Når jeg efterfølgende implementerer den på en side og i denne sides Page_load kalder:

DateBoxes.setDate(DateTime.Now)

...så kommer der ikke en fejlmeddelelse. På den anden side sætter den heller ikke datoen. Jeg går stærkt ud fra, at det er fordi, at kontrollen allerede er initialiseret. Eller hvad?
Avatar billede shadowdance Nybegynder
07. februar 2006 - 17:10 #1
Jeg fandt ud af svaret selv. Istedet for at initialisere kontrollerne i Page_Load i ascx-filen, flyttede jeg genereringen af dato-options op i Page_Init. Det hjalp!
Avatar billede shadowdance Nybegynder
07. februar 2006 - 17:11 #2
Lukker lige spørgsmålet.
Avatar billede snepnet Nybegynder
07. februar 2006 - 18:12 #3
måske du kan blive lidt inspirerert af noget i denne stil:
(de dage man kan vælge bør jo opdateres når man skifter dato - men du kan muligvis bruge det til noget)

// usercontrol
<%@ Control Language="C#" ClassName="SomeUserControl" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
    }
   
    public DateTime GetDate()
    {
        DateTime dt = new DateTime(int.Parse(ddYear.Text), Array.IndexOf(System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames, ddMonth.Text) + 1, int.Parse(ddDay.Text));
        return dt;
    }
   
    public void ShowDate(DateTime date)
    {
        UpdateDropDowns(date);
       
        ddYear.Text = date.Year.ToString();
        ddMonth.Text = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(date.Month);
        ddDay.Text = date.Day.ToString();       
    }
   
    private void UpdateDropDowns(DateTime date)
    {
        ddYear.DataSource = GetAvailableYears();
        ddYear.DataBind();

        ddMonth.DataSource = GetAvailableMonthNames();
        ddMonth.DataBind();

        ddDay.DataSource = GetAvailableDayNumbers(date);
        ddDay.DataBind();
    }

    private string[] GetAvailableYears()
    {
        string[] years = new string[100];
        for (int i = 0; i < 100; i++)
        {
            years[i] = (1950 + i).ToString();
        }
        return years;       
    }

    private string[] GetAvailableMonthNames()
    {
        return System.Globalization.DateTimeFormatInfo.CurrentInfo.MonthNames;
    }
   
    private string[] GetAvailableDayNumbers(DateTime date)
    {
        int daysInMonth = DateTime.DaysInMonth(date.Year, date.Month);
        string[] days = new string[daysInMonth];
        for (int i = 1; i <= daysInMonth; i++)
        {
            days[i-1] = i.ToString();
        }
        return days;
    }
</script>

<asp:DropDownList ID="ddDay" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddMonth" runat="server">
</asp:DropDownList>
<asp:DropDownList ID="ddYear" runat="server">
</asp:DropDownList>


// og en side
<%@ Page Language="C#" %>
<%@ Register Src="SomeUserControl.ascx" TagName="SomeUserControl" TagPrefix="uc1" %>

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

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SomeUserControl1.ShowDate(new DateTime(2001, 11, 21));
        }
    }

    protected void btnSetDate_Click(object sender, EventArgs e)
    {
        SomeUserControl1.ShowDate(new DateTime(1997, 6, 14));
    }

    protected void btnGetDate_Click(object sender, EventArgs e)
    {
        this.txtSelectedDate.Text = SomeUserControl1.GetDate().ToString();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <uc1:SomeUserControl ID="SomeUserControl1" runat="server" />       
        <br />
        <br />
        <asp:Button ID="btnSetDate" runat="server" Text="SetDate" OnClick="btnSetDate_Click" />
        <asp:Button ID="btnGetDate" runat="server" Text="GetDate" OnClick="btnGetDate_Click" />
        <asp:TextBox ID="txtSelectedDate" runat="server"></asp:TextBox></div>
    </form>
</body>
</html>
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