Avatar billede brokov Nybegynder
12. juli 2006 - 09:48 Der er 22 kommentarer og
1 løsning

Adressering af Controls i code behind

Jeg har en .aspx side, hvor jeg fra den tilhørende .aspx.cs side gerne vil adressere nogen controller.
Siden bruger master pages og koden er C#.
Min .aspx side ser sådan ud:

<%@ Page Language="C#" MasterPageFile="~/LoebeDatabase.master" AutoEventWireup="true"
    CodeFile="UpdateProfile.aspx.cs" Inherits="UpdateProfile" Title="Untitled Page" %>
.
.
.
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMain" runat="Server">
.
.
.
        <asp:DetailsView ID="DetailsViewExtendProfile" OnDataBound="DetailsViewExtendProfile_DataBound"
            runat="server" AutoGenerateRows="False" DataKeyNames="F_UserInfoID" DataSourceID="SqlDataSourceCreateUser"
            Height="50px" Width="125px" CellPadding="4" ForeColor="#333333" GridLines="None">
.
.
.
                <asp:TemplateField HeaderText="F_Birthday" SortExpression="F_Birthday">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("F_Birthday") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DropDownList ID="DropDownListCalMonth" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalMonth_SelectedIndexChanged"
                            Width="101px">
                        </asp:DropDownList>&nbsp;
                        <asp:DropDownList ID="DropDownListCalYear" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalYear_SelectedIndexChanged"
                            Width="104px">
                        </asp:DropDownList>&nbsp;<br />
                        <br />
                        <asp:Calendar ID="CalendarSource" runat="server" BackColor="#FFFFCC" BorderColor="#FFCC66"
                            BorderWidth="1px" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
                            ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" OnSelectionChanged="CalendarSource_SelectionChanged"
                            SelectedDate='<%# Bind("F_Birthday") %>'>
                            <SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
                            <TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
                            <SelectorStyle BackColor="#FFCC66" />
                            <OtherMonthDayStyle ForeColor="#CC9966" />
                            <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
                            <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" />
                            <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" />
                        </asp:Calendar>
                        <br />
                        <asp:Label ID="LabelDate" runat="server" Text="Label" Width="390px"></asp:Label><br />
                        <%-- <asp:Calendar ID="Calendar1" runat="server" SelectedDate='<%# Bind("F_Birthday") %>'>
                        </asp:Calendar>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# (string) GetMyDate() %>'></asp:TextBox> --%>
                    </InsertItemTemplate>
                    <ItemTemplate>
                        <%-- <asp:Label ID="Label1" runat="server" Text='<%# Bind("F_Birthday") %>'></asp:Label> --%>
                        <asp:Label ID="LabelBirthDate" runat="server" Text='<%# (string) GetMyDate() %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
.
.
.


Så vil jeg gerne kunne adressere forskellige af controllerne i min code behind. Jeg har prøvet forskellige forslag, men det sidste, hvor jeg prøver at adressere hele vejen igennem, kan kompile, men giver følgende fejl:
System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

Den prøvede kode er:
Calendar CalendarSource = Calendar CalendarSource = (Calendar)Master.FindControl("DetailsViewExtendProfile").FindControl("CalendarSource");

Label LabelDate = (Label)Master.FindControl("DetailsViewExtendProfile").FindControl("LabelDate");

DropDownList DropDownListCalMonth = (DropDownList)Master.FindControl("DetailsViewExtendProfile").FindControl("DropDownListCalMonth");


Hvordan er den rigtige måde at lave det her på?
Avatar billede brokov Nybegynder
12. juli 2006 - 09:54 #1
Glemte måske lige at nævne, det er .net 2.0 det er lavet i.
Avatar billede snepnet Nybegynder
12. juli 2006 - 09:55 #2
Prøv med:
DropDownList drop = DetailsViewExtendProfile.FindControl("DropDownListCalMonth") as DropDownList;
Mvh
Avatar billede brokov Nybegynder
12. juli 2006 - 10:43 #3
Den ser heller ikke ud til at virke. Jeg tror jeg smider hele koden og håber det ikke bliver for uoverskueligt. Når jeg kører siden, får jeg fejlen på linien "CalendarSource.ShowTitle = false;"

.aspx side

<%@ Page Language="C#" MasterPageFile="~/LoebeDatabase.master" AutoEventWireup="true"
    CodeFile="UpdateProfile.aspx.cs" Inherits="UpdateProfile" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolderTop" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolderMain" runat="Server">
    <h1 style="text-align: center">
        Opdatering af profil</h1>
    <div style="text-align: center">
        &nbsp; &nbsp; &nbsp;
        <asp:DetailsView ID="DetailsViewExtendProfile" OnDataBound="DetailsViewExtendProfile_DataBound"
            runat="server" AutoGenerateRows="False" DataKeyNames="F_UserInfoID" DataSourceID="SqlDataSourceCreateUser"
            Height="50px" Width="125px" CellPadding="4" ForeColor="#333333" GridLines="None">
            <EmptyDataTemplate>
                Der er ingen data at vise.
            </EmptyDataTemplate>
            <Fields>
                <asp:BoundField DataField="F_UserInfoID" HeaderText="F_UserInfoID" ReadOnly="True"
                    SortExpression="F_UserInfoID" Visible="False" />
                <asp:BoundField DataField="F_UserID" HeaderText="F_UserID" SortExpression="F_UserID"
                    Visible="False" />
                <asp:BoundField DataField="F_Name" HeaderText="F_Name" SortExpression="F_Name" />
                <asp:BoundField DataField="F_Address" HeaderText="F_Address" SortExpression="F_Address" />
                <asp:BoundField DataField="F_ZipCode" HeaderText="F_ZipCode" SortExpression="F_ZipCode" />
                <asp:BoundField DataField="F_City" HeaderText="F_City" SortExpression="F_City" />
                <asp:BoundField DataField="F_Email" HeaderText="F_Email" SortExpression="F_Email" />
                <asp:BoundField DataField="F_Sex" HeaderText="F_Sex" SortExpression="F_Sex" />
                <asp:TemplateField HeaderText="F_Birthday" SortExpression="F_Birthday">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("F_Birthday") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DropDownList ID="DropDownListCalMonth" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalMonth_SelectedIndexChanged"
                            Width="101px">
                        </asp:DropDownList>&nbsp;
                        <asp:DropDownList ID="DropDownListCalYear" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalYear_SelectedIndexChanged"
                            Width="104px">
                        </asp:DropDownList>&nbsp;<br />
                        <br />
                        <asp:Calendar ID="CalendarSource" runat="server" BackColor="#FFFFCC" BorderColor="#FFCC66"
                            BorderWidth="1px" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
                            ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" OnSelectionChanged="CalendarSource_SelectionChanged"
                            SelectedDate='<%# Bind("F_Birthday") %>'>
                            <SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
                            <TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
                            <SelectorStyle BackColor="#FFCC66" />
                            <OtherMonthDayStyle ForeColor="#CC9966" />
                            <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
                            <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" />
                            <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" />
                        </asp:Calendar>
                        <br />
                        <asp:Label ID="LabelDate" runat="server" Text="Label" Width="390px"></asp:Label><br />
                    </InsertItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="LabelBirthDate" runat="server" Text='<%# (string) GetMyDate() %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ButtonType="Button" ShowEditButton="True" ShowInsertButton="True" />
            </Fields>
            <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <CommandRowStyle BackColor="#FFFFC0" Font-Bold="True" />
            <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
            <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
            <FieldHeaderStyle BackColor="#FFFF99" Font-Bold="True" />
            <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
            <AlternatingRowStyle BackColor="White" />
        </asp:DetailsView>
        &nbsp;
        <asp:SqlDataSource ID="SqlDataSourceCreateUser" runat="server" ConflictDetection="CompareAllValues"
            ConnectionString="<%$ ConnectionStrings:ConnectionStringStatisticInfo %>" DeleteCommand="DELETE FROM [UserInfo] WHERE [F_UserInfoID] = @original_F_UserInfoID AND [F_UserID] = @original_F_UserID AND [F_Name] = @original_F_Name AND [F_Address] = @original_F_Address AND [F_ZipCode] = @original_F_ZipCode AND [F_City] = @original_F_City AND [F_Email] = @original_F_Email AND [F_Sex] = @original_F_Sex AND [F_Birthday] = @original_F_Birthday"
            InsertCommand="INSERT INTO UserInfo(F_UserID, F_Name, F_Address, F_ZipCode, F_City, F_Email, F_Sex, F_Birthday) VALUES (@Param1, @F_Name, @F_Address, @F_ZipCode, @F_City, @F_Email, @F_Sex, @F_Birthday)"
            OldValuesParameterFormatString="original_{0}" ProviderName="<%$ ConnectionStrings:ConnectionStringStatisticInfo.ProviderName %>"
            SelectCommand="SELECT F_UserInfoID, F_UserID, F_Name, F_Address, F_ZipCode, F_City, F_Email, F_Sex, F_Birthday FROM UserInfo WHERE (F_UserID = @Param1)"
            UpdateCommand="UPDATE UserInfo SET F_UserID = @F_UserID, F_Name = @F_Name, F_Address = @F_Address, F_ZipCode = @F_ZipCode, F_City = @F_City, F_Email = @F_Email, F_Sex = @F_Sex, F_Birthday = @F_Birthday WHERE (F_UserInfoID = @original_F_UserInfoID) AND (F_UserID = @original_F_UserID) AND (F_Name = @original_F_Name) AND (F_Address = @original_F_Address) AND (F_ZipCode = @original_F_ZipCode) AND (F_City = @original_F_City) AND (F_Email = @original_F_Email) AND (F_Sex = @original_F_Sex) AND (F_Birthday = @original_F_Birthday)">
            <DeleteParameters>
                <asp:Parameter Name="original_F_UserInfoID" Type="Object" />
                <asp:Parameter Name="original_F_UserID" Type="String" />
                <asp:Parameter Name="original_F_Name" Type="String" />
                <asp:Parameter Name="original_F_Address" Type="String" />
                <asp:Parameter Name="original_F_ZipCode" Type="Int32" />
                <asp:Parameter Name="original_F_City" Type="String" />
                <asp:Parameter Name="original_F_Email" Type="String" />
                <asp:Parameter Name="original_F_Sex" Type="String" />
                <asp:Parameter Name="original_F_Birthday" Type="DateTime" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="F_UserID" Type="String" />
                <asp:Parameter Name="F_Name" Type="String" />
                <asp:Parameter Name="F_Address" Type="String" />
                <asp:Parameter Name="F_ZipCode" Type="Int32" />
                <asp:Parameter Name="F_City" Type="String" />
                <asp:Parameter Name="F_Email" Type="String" />
                <asp:Parameter Name="F_Sex" Type="String" />
                <asp:Parameter Name="F_Birthday" Type="DateTime" />
                <asp:Parameter Name="original_F_UserInfoID" Type="Object" />
                <asp:Parameter Name="original_F_UserID" Type="String" />
                <asp:Parameter Name="original_F_Name" Type="String" />
                <asp:Parameter Name="original_F_Address" Type="String" />
                <asp:Parameter Name="original_F_ZipCode" Type="Int32" />
                <asp:Parameter Name="original_F_City" Type="String" />
                <asp:Parameter Name="original_F_Email" Type="String" />
                <asp:Parameter Name="original_F_Sex" Type="String" />
                <asp:Parameter Name="original_F_Birthday" Type="DateTime" />
            </UpdateParameters>
            <InsertParameters>
                <asp:SessionParameter Name="Param1" SessionField="g" />
                <asp:Parameter Name="F_Name" Type="String" />
                <asp:Parameter Name="F_Address" Type="String" />
                <asp:Parameter Name="F_ZipCode" Type="Int32" />
                <asp:Parameter Name="F_City" Type="String" />
                <asp:Parameter Name="F_Email" Type="String" />
                <asp:Parameter Name="F_Sex" Type="String" />
                <asp:Parameter Name="F_Birthday" Type="DateTime" />
            </InsertParameters>
            <SelectParameters>
                <asp:SessionParameter Name="Param1" SessionField="g" />
            </SelectParameters>
        </asp:SqlDataSource>
    </div>
</asp:Content>



C# side

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class UpdateProfile : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Label LabelDate = (Label)DetailsViewExtendProfile.FindControl("LabelDate");
        //Hide the title of the calendar control
        //Calendar CalendarSource = (Calendar)DetailsViewExtendProfile.FindControl("CalendarSource");
        Calendar CalendarSource = DetailsViewExtendProfile.FindControl("CalendarSource") as Calendar;
        CalendarSource.ShowTitle = false;
        //Populate month and year dropdown list boxes which
        //replace the original calendar title

        if (!Page.IsPostBack)
        {

            Populate_MonthddList();

            Populate_YearddList();

        }

        LabelDate.Text = "Current date: " + CalendarSource.TodaysDate;
    }
   
    protected string GetMyDate()
    {
        return DateTime.Now.ToShortDateString();
    }

    protected void DetailsViewExtendProfile_DataBound(object sender, EventArgs e)
    {
        if (DetailsViewExtendProfile.PageCount < 1)
        {
            DetailsViewExtendProfile.ChangeMode(DetailsViewMode.Insert);
        }
        else
        {
            DetailsViewExtendProfile.ChangeMode(DetailsViewMode.Edit);
        }
    }

    private void Populate_MonthddList()
    {
        DropDownList DropDownListCalMonth = (DropDownList)Master.FindControl("DropDownListCalMonth");

        DropDownListCalMonth.Items.Add("Januar");

        DropDownListCalMonth.Items.Add("Februar");

        DropDownListCalMonth.Items.Add("Marts");

        DropDownListCalMonth.Items.Add("April");

        DropDownListCalMonth.Items.Add("Maj");

        DropDownListCalMonth.Items.Add("Juni");

        DropDownListCalMonth.Items.Add("Juli");

        DropDownListCalMonth.Items.Add("August");

        DropDownListCalMonth.Items.Add("September");

        DropDownListCalMonth.Items.Add("Oktober");

        DropDownListCalMonth.Items.Add("November");

        DropDownListCalMonth.Items.Add("December");

        // DropDownListCalMonth.Items.FindByValue((objdate.Month.ToString())).Selected = true;

        // DropDownListCalYear.Items.FindByValue(DateTime.Now.Month.ToString()).Selected = true;

    }

    private void Populate_YearddList()
    {
        DropDownList DropDownListCalYear = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalYear");

        //Year list can be extended

        int intYear;

        for (intYear = Convert.ToInt16(DateTime.Now.Year) - 120; intYear <= DateTime.Now.Year + 0; intYear++)
        {

            DropDownListCalYear.Items.Add(Convert.ToString(intYear));

        }

        DropDownListCalYear.Items.FindByValue(DateTime.Now.Year.ToString()).Selected = true;

    }

    protected void CalendarSource_SelectionChanged(object sender, EventArgs e)
    {
        Calendar CalendarSource = (Calendar)DetailsViewExtendProfile.FindControl("CalendarSource");

        Label LabelDate = (Label)DetailsViewExtendProfile.FindControl("LabelDate");

        if (CalendarSource.SelectedDates.Count == 1)

            // If one date is selected, display it.
           
            LabelDate.Text = "Selected date: " + CalendarSource.SelectedDate;

        else

            // If multiple dates are selected, display them.

            LabelDate.Text = "Selected dates: " + CalendarSource.SelectedDates[0] + " to " + CalendarSource.SelectedDates[CalendarSource.SelectedDates.Count - 1];

    }

    protected void DropDownListCalMonth_SelectedIndexChanged(object sender, EventArgs e)
    {
        Calendar CalendarSource = (Calendar)DetailsViewExtendProfile.FindControl("CalendarSource");
        DropDownList DropDownListCalYear = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalYear");
        DropDownList DropDownListCalMonth = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalMonth");
       
        CalendarSource.TodaysDate = Convert.ToDateTime(DropDownListCalMonth.SelectedItem.Value + " 1, " + DropDownListCalYear.SelectedItem.Value);

    }

    protected void DropDownListCalYear_SelectedIndexChanged(object sender, EventArgs e)
    {
        Calendar CalendarSource = (Calendar)DetailsViewExtendProfile.FindControl("CalendarSource");
        DropDownList DropDownListCalYear = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalYear");
        DropDownList DropDownListCalMonth = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalMonth");

        CalendarSource.TodaysDate = Convert.ToDateTime(DropDownListCalMonth.SelectedItem.Value + " 1, " + DropDownListCalYear.SelectedItem.Value);

    }
}
Avatar billede snepnet Nybegynder
12. juli 2006 - 11:06 #4
Prøv at kommentér det her ud:
Calendar CalendarSource = DetailsViewExtendProfile.FindControl("CalendarSource") as Calendar;
CalendarSource.ShowTitle = false;
Og se om det virker i dine eventhandlere.
Mvh
Avatar billede brokov Nybegynder
12. juli 2006 - 11:23 #5
Så kommer den samme fejl, bare først nede i linien "DropDownListCalMonth.Items.Add("Januar");"
Og det er ligemeget om FindControl bliver brugt som jeg først havde det:'
DropDownList DropDownListCalMonth = (DropDownList)DetailsViewExtendProfile.FindControl("DropDownListCalMonth");

eller som du foreslog det længere oppe:

DropDownList DropDownListCalMonth = DetailsViewExtendProfile.FindControl("DropDownListCalMonth") as DropDownList;

Men jeg er ikke helt sikker på hvad dumner med om det virker i mine eventhandlere, jeg er ikke nogen haj til det her endnu.

Jeg troede det her var forholdvis nemt, men det er det måske slet ikke. Jeg kan sagtens proppe en almindelig kalender ind i template fields, den udvidede kalender her kører også fint selv, og adressering med FindControl virker også i andre sammenhænge. Men når det skal spille sammen... så du må lige sige til hvis vi når dertil hvor der skal fler point på bordet.
Avatar billede snepnet Nybegynder
12. juli 2006 - 12:00 #6
Der er ikke nogle problemer i det overhovedet - det skal virke uden problemer, men i den kode du har vist, bruger du også noget Master.FindControl(...)
Men... du har kontroller i din edititemtemplate, og dem kan du ikke finde med mindre du er i editmode (så findes de jo ikke).
Mvh
Avatar billede brokov Nybegynder
12. juli 2006 - 12:16 #7
Jep, jeg så lige svipseren med Master før, det var et gammelt forsøg der ikke var blevet rettet tilbage. Det rettede jeg da jeg prøvede ved tiden 12/07-2006 11:23:16

Men de kontroller i min EditItemTemplate:
<EditItemTemplate>
  <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("F_Birthday") %>'></asp:TextBox>
</EditItemTemplate>

Det burde da ikke give nogen problemer, eller burde det? Den bliver jo ikke refereret fra min kode, indtil videre da. Som sagt har jeg kørt det før, med kun en standard kalender kontrol, uden noget code behind. Men den modificerede kalender her ter sig.
Avatar billede snepnet Nybegynder
12. juli 2006 - 12:40 #8
Det var egentlig også InsertItemTemplate jeg mente - sorry.
Pointen er, at hvis ikke kontrollen er tilstede i kontroltræet, så kan du heller ikke finde den.
Du må derfor styre på dit viewmode - og kun tilgå de kontroller der kan tilgås i det aktuelle mode.
Mvh
Avatar billede brokov Nybegynder
12. juli 2006 - 13:22 #9
Hvis jeg forstår dig ret, bør jeg nok flytte alt hvad jeg har i pageload et andet sted hen, og først afvikle metodekald osv. efter jeg har fået afviklet min DetailsViewExtendProfile_DataBound hvor jeg sætter viewmode efter om den aktuelle bruger har udfyldt eller ej. Selv om den bruger jeg logger ind med, egentlig burde sætte insert mode på.
Ellers så burde den kalender jo egentlig også være i EditItemTemplate delen. Og så burde det vel fungere...?
Jeg skal vist lige have renset hovedet og prøvet noget af, og så vender jeg nok frygtelig tilbage.
Avatar billede snepnet Nybegynder
12. juli 2006 - 13:46 #10
Du vender bare tilbage når det passer :o)
Mvh
Avatar billede brokov Nybegynder
04. august 2006 - 10:07 #11
Jeg var nød til at finde en anden løsning til mit projekt, men jeg skal finde ud af det her, koste hvad det koste vil. Så jeg har skåret ned, så kun det vigtige er med, så håber jeg en eller anden kan hjælpe på vej.
Problemet igen:
På siden er der et DetailsView og en kalender. Når jeg klikker på Ny eller Rediger, skal en kalender magen til vises i mit DetailsView.
Jeg har uden held forsøgt med at adressere ned igennem siden og endda igennem master siden med FindControl, men alle forsøg giver samme fejl som tidligere; System.NullReferenceException: Objektreferencen er ikke indstillet til en forekomst af et objekt.

Jeg har to filer med tilhørende codebehind: MasterPage.master og Default.aspx, samt en simpel database.
*****MasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!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>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
        </asp:contentplaceholder>
        <asp:Label ID="LabelMasterDate" runat="server" Text="Label" Width="390px"></asp:Label>
    </div>
    </form>
</body>
</html>

*****MasterPage.master.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class MasterPage : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
       
    }
}

*****Default.aspx:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="CalendarTest" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    **************************************************
    Udvidet kalender
    <br />
    <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" CellPadding="4"
        DataKeyNames="ID" DataSourceID="SqlDataSource1" ForeColor="#333333" GridLines="None"
        Height="50px" Width="125px">
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <CommandRowStyle BackColor="#D1DDF1" Font-Bold="True" />
        <EditRowStyle BackColor="#2461BF" />
        <RowStyle BackColor="#EFF3FB" />
        <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
        <Fields>
            <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"
                SortExpression="ID" />
            <asp:BoundField DataField="Navn" HeaderText="Navn" SortExpression="Navn" />
            <asp:TemplateField HeaderText="Tid" SortExpression="Tid">
                <EditItemTemplate>
                    <asp:DropDownList ID="DropDownListCalMonth" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalMonth_SelectedIndexChanged"
                        Width="101px">
                    </asp:DropDownList>&nbsp;
                    <asp:DropDownList ID="DropDownListCalYear" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalYear_SelectedIndexChanged"
                        Width="104px">
                    </asp:DropDownList>&nbsp;<br />
                    <br />
                    <asp:Calendar ID="CalendarSource" runat="server" BackColor="#FFFFCC" BorderColor="#FFCC66"
                        BorderWidth="1px" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
                        ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" OnSelectionChanged="CalendarSource_SelectionChanged"
                        SelectedDate='<%# Bind("Tid") %>'>
                        <SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
                        <TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
                        <SelectorStyle BackColor="#FFCC66" />
                        <OtherMonthDayStyle ForeColor="#CC9966" />
                        <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
                        <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" />
                        <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" />
                    </asp:Calendar>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:DropDownList ID="DropDownListCalMonth" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalMonth_SelectedIndexChanged"
                        Width="101px">
                    </asp:DropDownList>&nbsp;
                    <asp:DropDownList ID="DropDownListCalYear" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalYear_SelectedIndexChanged"
                        Width="104px">
                    </asp:DropDownList>&nbsp;<br />
                    <br />
                    <asp:Calendar ID="CalendarSource" runat="server" BackColor="#FFFFCC" BorderColor="#FFCC66"
                        BorderWidth="1px" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
                        ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" OnSelectionChanged="CalendarSource_SelectionChanged"
                        SelectedDate='<%# Bind("Tid") %>'>
                        <SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
                        <TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
                        <SelectorStyle BackColor="#FFCC66" />
                        <OtherMonthDayStyle ForeColor="#CC9966" />
                        <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
                        <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" />
                        <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" />
                    </asp:Calendar>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("Tid") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" />
        </Fields>
        <FieldHeaderStyle BackColor="#DEE8F5" Font-Bold="True" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <AlternatingRowStyle BackColor="White" />
    </asp:DetailsView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
        DeleteCommand="DELETE FROM [Table1] WHERE [ID] = @ID" InsertCommand="INSERT INTO [Table1] ([Navn], [Tid]) VALUES (@Navn, @Tid)"
        SelectCommand="SELECT [ID], [Navn], [Tid] FROM [Table1]" UpdateCommand="UPDATE [Table1] SET [Navn] = @Navn, [Tid] = @Tid WHERE [ID] = @ID">
        <DeleteParameters>
            <asp:Parameter Name="ID" Type="Int32" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="Navn" Type="String" />
            <asp:Parameter Name="Tid" Type="DateTime" />
            <asp:Parameter Name="ID" Type="Int32" />
        </UpdateParameters>
        <InsertParameters>
            <asp:Parameter Name="Navn" Type="String" />
            <asp:Parameter Name="Tid" Type="DateTime" />
        </InsertParameters>
    </asp:SqlDataSource>
    <br />
    **************************************************
    Oprindelig kalender
    <br />
    <asp:DropDownList ID="DropDownListCalMonth" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalMonth_SelectedIndexChanged"
        Width="101px">
    </asp:DropDownList>&nbsp;
    <asp:DropDownList ID="DropDownListCalYear" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListCalYear_SelectedIndexChanged"
        Width="104px">
    </asp:DropDownList>&nbsp;<br />
    <br />
    <asp:Calendar ID="CalendarSource" runat="server" BackColor="#FFFFCC" BorderColor="#FFCC66"
        BorderWidth="1px" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt"
        ForeColor="#663399" Height="200px" ShowGridLines="True" Width="220px" OnSelectionChanged="CalendarSource_SelectionChanged">
        <SelectedDayStyle BackColor="#CCCCFF" Font-Bold="True" />
        <TodayDayStyle BackColor="#FFCC66" ForeColor="White" />
        <SelectorStyle BackColor="#FFCC66" />
        <OtherMonthDayStyle ForeColor="#CC9966" />
        <NextPrevStyle Font-Size="9pt" ForeColor="#FFFFCC" />
        <DayHeaderStyle BackColor="#FFCC66" Font-Bold="True" Height="1px" />
        <TitleStyle BackColor="#990000" Font-Bold="True" Font-Size="9pt" ForeColor="#FFFFCC" />
    </asp:Calendar>
    <br />
    <asp:Label ID="LabelDate" runat="server" Text="Label" Width="390px"></asp:Label><br />
    **************************************************
</asp:Content>

*****Default.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CalendarTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        //Hide the title of the calendar control

        CalendarSource.ShowTitle = false;
        //Calendar test = Master.FindControl("ContentPlaceHolder1").FindControl("DetailsView1").FindControl("CalendarSource") as Calendar;
        //test.ShowTitle = false;

        //Populate month and year dropdown list boxes which

        //replace the original calendar title

        if (!Page.IsPostBack)
        {

            Populate_MonthddList();

            Populate_YearddList();

        }

        LabelDate.Text = "Current date: " + CalendarSource.TodaysDate;
    }

    private void Populate_MonthddList()
    {
       
                DropDownListCalMonth.Items.Add("Januar");

                DropDownListCalMonth.Items.Add("Februar");

                DropDownListCalMonth.Items.Add("Marts");

                DropDownListCalMonth.Items.Add("April");

                DropDownListCalMonth.Items.Add("Maj");

                DropDownListCalMonth.Items.Add("Juni");

                DropDownListCalMonth.Items.Add("Juli");

                DropDownListCalMonth.Items.Add("August");

                DropDownListCalMonth.Items.Add("September");

                DropDownListCalMonth.Items.Add("Oktober");

                DropDownListCalMonth.Items.Add("November");

                DropDownListCalMonth.Items.Add("December");

        // DropDownListCalMonth.Items.FindByValue((objdate.Month.ToString())).Selected = true;

        // DropDownListCalYear.Items.FindByValue(DateTime.Now.Month.ToString()).Selected = true;

    }

    private void Populate_YearddList()
    {

        //Year list can be extended

        int intYear;

        for (intYear = Convert.ToInt16(DateTime.Now.Year) - 120; intYear <= DateTime.Now.Year + 0; intYear++)
        {

            DropDownListCalYear.Items.Add(Convert.ToString(intYear));

        }

        DropDownListCalYear.Items.FindByValue(DateTime.Now.Year.ToString()).Selected = true;

    }

    protected void CalendarSource_SelectionChanged(object sender, EventArgs e)
    {

        if (CalendarSource.SelectedDates.Count == 1)

            // If one date is selected, display it.

            LabelDate.Text = "Selected date: " + CalendarSource.SelectedDate;

        else

            // If multiple dates are selected, display them.

            LabelDate.Text = "Selected dates: " + CalendarSource.SelectedDates[0] + " to " + CalendarSource.SelectedDates[CalendarSource.SelectedDates.Count - 1];

    }

    protected void DropDownListCalMonth_SelectedIndexChanged(object sender, EventArgs e)
    {

        CalendarSource.TodaysDate = Convert.ToDateTime(DropDownListCalMonth.SelectedItem.Value + " 1, " + DropDownListCalYear.SelectedItem.Value);

    }

    protected void DropDownListCalYear_SelectedIndexChanged(object sender, EventArgs e)
    {

        CalendarSource.TodaysDate = Convert.ToDateTime(DropDownListCalMonth.SelectedItem.Value + " 1, " + DropDownListCalYear.SelectedItem.Value);

    }
}

Databasen har primærnøglen ID der bliver auto incrementeret, en varchar Navn og en datetime Tid.
Avatar billede snepnet Nybegynder
05. august 2006 - 12:52 #12
Hov - der er fortsat gang i den her :o)
Kan du ikke lægge et fungerende projekt til download, så kan vi hente det og fikse det.
Mvh
Avatar billede snepnet Nybegynder
05. august 2006 - 12:52 #13
Ellers læg din email - så skriver jeg til dig, og du kan sende det tilbage.
Mvh
Avatar billede brokov Nybegynder
06. august 2006 - 14:50 #14
Selvfølgelig er der gang i den, ellers var der jo blevet lukket. ;-)
Men jeg har prøvet at lægge det op her
http://rapidshare.de/files/28392630/CalendarTestFindControl.rar.html
Avatar billede snepnet Nybegynder
06. august 2006 - 15:46 #15
:oD

Nu kan jeg jo ikke køre din applikation da den bruger en database du har, men det ser bare ud til at balladen er som angivet 12/07-2006 12:40:10.

Du har kalenderen angivet i din edititemtemplate, og i din insertitem template, så hvis dit detailsview ikke er i ét af de modes, eksisterer din kalender ikke.... Og du har jo så heller ikke rigtig noget at bruge den til.

Du må nøjes med at programmere op imod kalenderen når den er tilstede - altså når dit detailsview er i enten edit eller insert mode.

Mvh
Avatar billede brokov Nybegynder
07. august 2006 - 10:02 #16
Jeg troede egentlig databasen var tilgængelig, men her er en Access database i stedet. Plus at jeg har lagt kalenderen ind i alle tre viewmodes i min template.
Men rækkefølgen i addresseringen med FindControl er stadigvæk uforståelig for mig. :-(
http://rapidshare.de/files/28484392/CalendarTestFindControl.rar.html
Avatar billede snepnet Nybegynder
07. august 2006 - 10:33 #17
Du behøver såmænd heller ikke at gå så voldsomt til vaflerne... Det her er rigeligt:
Calendar test = DetailsView1.FindControl("CalendarSource") as Calendar;
Men det du har skrevet fungerer også.
Hvad er det i det du har sendt du synes der ikke fungerer?
Mvh
Avatar billede brokov Nybegynder
07. august 2006 - 13:22 #18
Det ser faktisk ud som om det endelig fungerer.Gad vide hvad der lige er sket. Jeg vil lige se om det fungerer med resten, og hvis det gør, har jeg nok ikke flere spørgsmål, og kan jeg få lukket her.
Avatar billede snepnet Nybegynder
07. august 2006 - 13:34 #19
Det er bare ok :o)
Mvh
Avatar billede brokov Nybegynder
09. august 2006 - 10:02 #20
Det virker faktisk nu. Jeg har lige et afsluttende spørgsmål mht. casting vha. (DropDownList) og as DropDownList. Du brugte as DropDownList, men det burde vel ikke gøre nogen forskel. Eller er der en bug der gør at man bør foretrække det ene frem for det andet i den her forbindelse?

Og så må der nok komme et svar fra nogen, hvis nogen vil have point. :-)
Avatar billede snepnet Nybegynder
09. august 2006 - 10:51 #21
Når du caster med as, får du ikke nogen exception hvis det kikser - du får null som resultat.
SomeClass instance = (SomeClass)someObject;
Her får du en exception hvis dit cast ikke går godt.

SomeClass instance = someObject as SomeClass;
Ingen exception, og du kan nøjes med at spørge på om instance er null:

if(instance != null)
{
  // her er det så sikkert at bruge objektet som den angivne type
}

Generelt er as at foretrække.

Mvh
Avatar billede brokov Nybegynder
10. august 2006 - 09:56 #22
Ah, det kan jeg godt se. Så kan man håndtere null fejl uden om de dumme exceptions.
Så tror jeg efterhånden jeg har fattet lidt af alt det her. Om ikke andet har jeg et fungerende eksempel jeg har forstået. :-)
Avatar billede snepnet Nybegynder
10. august 2006 - 10:09 #23
Super :o)
Du får et svar her så.
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