Laden...

System.Web.UI.WebControls.Calendar Control in _DayRender deaktivieren

Erstellt von userid7145 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.339 Views
U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren
System.Web.UI.WebControls.Calendar Control in _DayRender deaktivieren

Hallo Zusammen,

ich habe hier eine Anfänger Frage. Ich möchte im Event _DayRender den Kalender deaktivieren. Ich habe schon folgendes versucht, leider ohne Erfolg:

System.Web.UI.WebControls.Calendar cal = (System.Web.UI.WebControls.Calendar)sender;
cal.Enabled = false;

Wie kann das Problem gelöst werden?

Vielen Dank!!

Grüße,
Tobias

1.433 Beiträge seit 2006
vor 15 Jahren

Wenn ich dass so sehe dann ist cal dein calendar und wenn Du ihn im Event _DayRender deaktivieren willst wurde er bereits initialisiert. Wieso möchtest Du ihn im Event _DayRender deaktivieren?

Generell kannst Du ein Control so deaktivieren:



Calendar cal = (Calendar)FindControl("cal");
cal.enabled = false;


Meistens werden Controls aber Cleintseitig deaktiviert, damit nicht ein extra Postback an den Server geschickt werden muss.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren

Vielen Dank für deine Erklärung !!
Leider kann ich kein Javascript bzw. in diesem Fall wäre es auch schwer denkbar den Kalender Clientseitig zu deaktivieren.

Perfekt!

U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren

Irgendwie bin ich verwirrt oder einfach nur unwissend.
Warum funktioniert:
Kalender3.disable=false;

und

    void calendar_DayRender(object sender, DayRenderEventArgs e)  
    {  
        String cal = ((System.Web.UI.WebControls.Calendar)sender).ID;  
        System.Web.UI.WebControls.Calendar cale = (System.Web.UI.WebControls.Calendar)this.Master.FindControl("Inhalt").FindControl(cal);  
        cale.Enabled = false;  

nicht??

Vielen Dank!
Tobias

1.433 Beiträge seit 2006
vor 15 Jahren

Du hast vorher nicht geschrieben, dass das auf einem Master ist. Dann musst Du von Page her die Controls rekursiv durchgehen bis du den entsprechenden Kalender findest und dann deaktivieren.

MVP Peter Buchers Beitrag hierzu.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren

Hi,

der entsprechende Kalender ja bereits gefunden.

Wenn ich einen Breakpoint nach diesen Zeilen einfüge:

String cal = ((System.Web.UI.WebControls.Calendar)sender).ID;
System.Web.UI.WebControls.Calendar cale = (System.Web.UI.WebControls.Calendar)this.Master.FindControl("Inhalt").FindControl(cal);

und dann im Überwachungsfenster fogendes eingebe:
cale.VisibleDate
und Kalender3.VisibleDate
dann handelt es sich hierbei um das selbe Objekt. Oder ist das dann nur eine Kopie(Call by Value) ??

Ich blick's leider net 😦

1.433 Beiträge seit 2006
vor 15 Jahren

Also, DayRender ist das falsche Event. Wenn Du ihn deaktivieren musst, dann bevor er gerendert worden ist. Will heissen, dass Control, welches ja zuerst den Container rendert und dann die Tage, kann danach nicht mehr deaktiviert werden. Bei mir funktioniert's im Load-Event des Kalenders.

SiteMaster


<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteMaster.master.cs" Inherits="Thread.Number67136.SiteMaster" %>

<!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>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            <asp:Calendar ID="MasterCalendar" runat="server" OnLoad="MasterCalendar_DayRender"></asp:Calendar>
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

CodeBehind SiteMaster


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

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

        }

        protected void MasterCalendar_DayRender(object sender, EventArgs e)
        {
            Calendar cal = (Calendar)sender;
            cal.Enabled = false;
        }
    }
}

Benutze für Code immer die Codetags.

Hier noch der Lifecycle von ASP.NET Seiten : Übersicht über die ASP.NET-Zustandsverwaltung

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren

Vielen Dank für deine Hilfe! So ein bsch.. Problem hatte ich noch nie.

Ich habe 5 Kalender Controls, die alle diesen Event verwenden:


             System.Web.UI.WebControls.Calendar cal = (System.Web.UI.WebControls.Calendar)sender;
            DateTime stop = new DateTime(cal.VisibleDate.Year, cal.VisibleDate.Month, 1);
            DataTable tbl = (DataTable)Session["ClosedMonth"];
            foreach (DataRow row in tbl.Rows)
            {
                if (stop.Date.ToString() == row[0].ToString())
                {
                    cal.Enabled = false;
                    return;
                }
            }     
                cal.Enabled = true; 

Beim erstmaligen Laden funktioniert das wunderbar.

Nachdem ich aber durch einen Button den Monat erhöht habe:


          Calendar1.VisibleDate = Calendar1.VisibleDate.AddMonths(1);
           Calendar2.VisibleDate = Calendar2.VisibleDate.AddMonths(1);
            Calendar3.VisibleDate = Calendar3.VisibleDate.AddMonths(1);
            Calendar4.VisibleDate = Calendar4.VisibleDate.AddMonths(1);
           Calendar5.VisibleDate = Calendar5.VisibleDate.AddMonths(1);

wird der Load Event zwar aufgerufen, die Zeit (VisibleDate) ist aber nicht mehr die neue, sondern noch die alte Zeit.

Habe versucht durch den selben Code mit Calendar_VisibleMonthChanged auszuführen, was leider nicht funktioniert, da nur durch Benutzeraktion dieser ausgelöst wird.

Ich habe keine Idee wie man das Problem lösen könne, du?

Vielen Dank!!

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo towotec

String cal = ((System.Web.UI.WebControls.Calendar)sender).ID;
System.Web.UI.WebControls.Calendar cale = (System.Web.UI.WebControls.Calendar)this.Master.FindControl("Inhalt").FindControl(cal);

Das "sender" Argument ist schon dein gesuchtes Control.

dann handelt es sich hierbei um das selbe Objekt. Oder ist das dann nur eine Kopie(Call by Value) ??

Nein die Referenz by value:

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

U
userid7145 Themenstarter:in
14 Beiträge seit 2007
vor 15 Jahren

Hallo,

vielen Dank Peter, wie dumm von mir.

Mein neues Problem ist jetzt, dass bei:


        protected void Calendar_Load(object sender, EventArgs e)
        {
            System.Web.UI.WebControls.Calendar cal = (System.Web.UI.WebControls.Calendar)sender;
            DateTime stop = new DateTime(cal.VisibleDate.Year, cal.VisibleDate.Month, 1);
            DataTable tbl = (DataTable)Session["ClosedMonth"];
            foreach (DataRow row in tbl.Rows)
            {
                if (stop.Date.ToString() == row[0].ToString())
                {
                    cal.Enabled = false;
                    return;
                }
            }
            cal.Enabled = true;

        }

in cal.VisibleDate beim erstmaligen Load das richtige Datum enthalten ist. Wird, wie oben beschrieben, der Monat gewechselt ist in Cal.VisibleDate das alte Datum und nicht das Neue (nach Calendar5.VisibleDate = Calendar5.VisibleDate.AddMonths(-1);)
Lösungen?
Danke!