Avatar billede travelnow Nybegynder
04. oktober 2006 - 13:21 Der er 16 kommentarer og
1 løsning

Atlas og PopupControlExtender

Jeg har en PopupControlExtender der er bundet op mod en textbox og en kalender. Når jeg vælger en dato, skrives den så i tekstboksen, det virker fint.
Mit problem er hvordan kan jeg slette indholdet af tekstboksen igen, lad os bare for nemhedens skyld sige at der skal være en knap under boksen, som kan slette indholdet.
Avatar billede janus_007 Nybegynder
04. oktober 2006 - 22:53 #1
Brug denne istedet, den er gratis og ret smart; http://www.eworldui.net/CustomControls/CalendarPopup.aspx

Og brug din tid på noget bedre end Atlas *G* til PopUp hehe
Avatar billede travelnow Nybegynder
05. oktober 2006 - 00:44 #2
Nu har jeg kigget lidt på den, men jeg tror ikke jeg kan bruge den, da jeg har brug for at kunne styre fra 1 til x antal kalender som er afhængig af hinanden, dvs. hvis man vælger en dato i en af dem som ikke er korrekt i forhold til de andre, skal det være muligt at slette den valgte dato, eller alle de andre programatisk (ikke javascript).

Og for det andet skal jeg bruge sourcekoden, som koster ca 500 kr, og her har jeg så ikke nogen garanti for at den understøtter det den skal.

Så det duer ikke.

Er der virkelig ikke nogen her, som programmerer i Atlas og kender svaret.
Avatar billede janus_007 Nybegynder
05. oktober 2006 - 20:28 #3
Jeg har lavet en del i Atlas, men har altid opnået bedre resultater vha. Ajax og Javascript.

Det du skal lave for at få den funktionalitet i Atlas er en ControlExtender, det kan du finde en masse skriveri om på www.asp.net - under Atlas.

Anyway.. hvis du bare vil slette indholdet i en textbox ved en event af en art så:

<script language="Javacript">

function clearTextBox()
{
var myTextBox = document.getElementById("textboxID");
myText.innerHtml = "";
//Du kan evt også disable eller highlighte noget mere her
}
</script>

Så skal du bare kalde den metode når der trykkes på den knap du omtaler :-)
Vedr. eWorldUI så skal du nu ikke købe kildekoden, du skal bare bruge den og det er gratis (ca.), men det er helt op til dig det hele jo *S*
Avatar billede travelnow Nybegynder
05. oktober 2006 - 21:22 #4
ok, sorry, jeg burde nok have skrevet at jeg kender en del til javascript, så det med at slette indhold af felter og innerHtml ved jeg godt, men det kunne du jo ikke vide.

Hvis jeg skal forklare mit problem mere korrekt, har jeg brug for at jeg programatisk kan slette indholdet, altså serverside (om det så i den sidste ende er javascript der gør det (f.eks via Ajax er ikke så vigtig)).
Min problemstilling er at jeg har 2 eller flere af de der kalenderdropdown på siden, og hvis man så vælger en dato i dem alle og herefter vælger en dato i kalender nr 1, som er størrer end datoen i kalender 2 og 3, ja så skal indholdet i 2 og 3 slettes.

Jeg har læst utrolig mange spørgsmål/svar og arktikel på www.asp.net uden at finde det jeg skal bruge, så hvis du bare har en lidt mere konkret ting jeg kan søge efter eller endnu bedre et link hvor jeg kan læse om det. Ville det være fint.

Det allerbedste ville selvfølgelig være hvis du have en løsning.

Jeg har selv en ide til hvordan jeg kan løse det 'the dirty way', jeg kan jo fra serverside generere noget javascript der kan gøre det (som dit eksempel) og så smide det nederst på siden og næste gang man vælger en dato tilføjes scriptet så ikke. Men den løsning bryder jeg mig ikke så meget om, det er for mig at se ikke den rigtige måde at gøre det på. Men hvis jeg ikke snart finder en bedre løsning, er jeg nød til at gøre det på den måde, da jeg har en deadline der skal holdes.
Avatar billede snepnet Nybegynder
08. oktober 2006 - 23:51 #5
Du skriver at du vil slette det serverside, og også at du kunne gøre det ved at sende et javascript med ud (og - går jeg ud fra - lade dette slette det clientside).
Jeg er i tvivl om hvad det er du vil ... Er det en serverside eller clientside model du vil have?
Mvh
Avatar billede travelnow Nybegynder
09. oktober 2006 - 01:16 #6
Om det er server eller client-side er næsten ligemeget nu, for nu skal jeg bare have det til at virke. Jeg troede det ville være rimelig simpel at lave noget dynamisk javascript fra serverside, men det driller også. Det jeg forsøger er at indsætte scriptet når jeg modtager et event fra en kalender, men på det tidspunkt er page-load åbenbart kørt og derved bliver javascripten slet ikke indsat på siden.

Så, har du et forslag til hvordan det kan løses, jeg vil helst have det til at virke serverside, men det vigtigste er at jeg får det til at virke.
Avatar billede snepnet Nybegynder
09. oktober 2006 - 17:21 #7
Du kan indsætte scriptet fra din eventhandler istedet for fra page_load.
Men altså - hvis du bare skal have nulstillet teksten i et par tekstbokse fra din c# kode - er det jo bare at gøre det i din eventhandler:

if(hvad der nu skal være tilfældet)
{
  someTextBox1.Text = String.Empty;
  someTextBox2.Text = String.Empty;
}

Mvh
Avatar billede travelnow Nybegynder
10. oktober 2006 - 10:20 #8
Så simpel er det selvfølgelig ikke. Men nu ved jeg sådan set godt hvorfor det driller, det er jo fordi hver kalender ligger inde i et atlas-updatepanel. Så for at kunne genskabe mit problem, skal du selvfølge vide hvordan min kalender userkontrol ser ud.
<%@ Control Language="C#" AutoEventWireup="true" Inherits="BBE.Usercontrol_AtlasCalender" Codebehind="AtlasCalender.ascx.cs" %>
<%@ Register Assembly="AtlasControlToolkit" Namespace="AtlasControlToolkit" TagPrefix="atlasToolkit" %>
<div>
  <asp:Label ID="Label1" runat="server" Text="Dato"></asp:Label><br />
<asp:TextBox ID="CalendarTextBox" runat="server" Width="144" ></asp:TextBox>
    <asp:Panel ID="CalendarPanel" runat="server" CssClass="popupControl">
      <atlas:UpdatePanel ID="updpanel1" runat="server" >     
      <ContentTemplate>
        <div id="CalendarDiv" class="CalenderDiv" runat="server" >
        <asp:Calendar ID="BBECalendar" CssClass="calendar" OnDayRender="DayRender" runat="server" OnSelectionChanged="BBECalendar_SelectionChanged">
          <TitleStyle CssClass="TitleStyle" />
          <TodayDayStyle CssClass="TodayDayStyle" />
          <DayStyle CssClass="DayStyle" />
          <NextPrevStyle CssClass="NextPrevStyle" Wrap="False" />
          <DayHeaderStyle CssClass="DayHeader"/>     
          <OtherMonthDayStyle CssClass="OtherMonthDayStyle"/>   
        </asp:Calendar>           
        </div>
          <asp:Button ID="Button1" runat="server" Text="Cleardate" OnClick="Button1_Click" />
      </ContentTemplate>             
      </atlas:UpdatePanel>
    </asp:Panel>
    <atlasToolkit:PopupControlExtender ID="CalendarPopup" runat="server" >
        <atlasToolkit:PopupControlProperties OffsetX=20 TargetControlID="CalendarTextBox" PopupControlID="CalendarPanel" Position="Bottom"  />       
    </atlasToolkit:PopupControlExtender>
</div>

Ovenstående kontrol har jeg så 2 eller flere af på siden og det jeg så prøver på er at slette indholdet i tekstfeltet 'CalendarTextBox', hvis datoen i kalender 1 er større end kalender2. Dvs. med det samme man vælger en dato i en af kalenderne, skal den kontrollere de andre kalender.
Så grunden til at man ikke bare kan sige CalendarTextBox.text = "", er selvfølgelig fordi det er Atlas/Ajax og den opdaterer jo kun de kontroller der ligger i dens egen updatepanel. Så enten skal det løses ved hjælp af javascript eller også skal man kunne trigger updatepanelet i alle kalender.
Lige nu prøver jeg at lave noget javascript, som løber dem alle igennem efter hver update, men her har jeg også et problem, da siden jo ikke bliver genopfrisket og dermed kører scriptet ikke.
Avatar billede snepnet Nybegynder
11. oktober 2006 - 10:55 #9
Hvis du lægger en public method på din kontrol der kan slette datoen fra tekstfeltet:

public void ClearDate()
{
  this.CalendarTextBox.Text = String.Empty;
}

Så kan du jo kalde den udefra - f.eks. fra en eventhandler på din form:

Her to kalenderkontroller på en form:
<uc3:CalendarStuff ID="CalendarStuff1" runat="server" />
<br />
<uc3:CalendarStuff ID="CalendarStuff2" runat="server" />

Og du kan så bare cleare dem programmatisk sådan her:

CalendarStuff1.ClearDate();
CalendarStuff2.ClearDate();

Kan du fikse det på den måde?

Mvh
Avatar billede travelnow Nybegynder
11. oktober 2006 - 11:37 #10
Jeg har prøvet noget tilsvarende, så jeg tror ikke det vil virke, for du skal jo huske på at der ikke sker en postback og at hver kalender ligger i deres egen updatepanel og det vil jo sige at det kun er kontrollerne i den aktiverede kalender man har mulighed for at ændre i. Så umiddelbart vil jeg tro at man er nød til på en eller anden måde at kunne lave en trigger, som opdaterer alle kalender updatepaneler.

Jeg har indtil videre løst problemet 'the dirty way', jeg har lavet noget javascript, som kører hver gang der sker en ændring og jeg har en funktion (serverside), som løber alle kalenderne igennem og hvis en kalender skal blankes, sætter jeg en værdi i en hidden field, så dvs. at hvis kalender 2 og 3 skal blankes står der 2,3 i feltet, javascriptet bliver så styret ud fra dette.

Det er ikke en særlig pæn løsning, så hvis du kan komme med noget der kan styrer det serverside, vil det være enormt fedt. (nu ved jeg selvfølgelig ikke om det eksempel du beskriver virker, har du testet at det virker uden at der sker en postback)

For jeg må indrømme at jeg allerede har brugt alt alt for lang tid på det her, så med mindre der kommer noget, der ser ud til at virke, er jeg nød til at bruge min nuværende løsning.
Avatar billede snepnet Nybegynder
11. oktober 2006 - 13:39 #11
Du kan få noget her ... Ikke ligefrem produktionskode, men du kan da lige se om det kunne være en model:

En kalenderkontrol:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CalendarStuff.ascx.cs" Inherits="UserControls_CalendarStuff" %>
<%@ Register Assembly="AtlasControlToolkit" Namespace="AtlasControlToolkit" TagPrefix="atlasToolkit" %>
<div>
    <atlas:UpdatePanel ID="UpdatePanel1" runat="server" Mode="conditional">
        <ContentTemplate>
          <center>
                <asp:TextBox ID="DateTextBox" runat="server" Width="165px"></asp:TextBox>
                <asp:Panel ID="pnlPopUp" runat="server" CssClass="popupControl">   
                    <asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged">
                    </asp:Calendar>
                </asp:Panel>
            </center>
        </ContentTemplate>       
    </atlas:UpdatePanel>
    <atlasToolkit:PopupControlExtender ID="PopupControlExtender1" runat="server">
        <atlasToolkit:PopupControlProperties TargetControlID="DateTextBox" PopupControlID="pnlPopUp" Position="Bottom" />
    </atlasToolkit:PopupControlExtender>
</div>

Og koden til den:
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;
using AtlasControlToolkit;
using Microsoft.Web.UI;

public partial class UserControls_CalendarStuff : System.Web.UI.UserControl
{
    public event EventHandler DateChanged;

    protected virtual void OnDateChanged()
    {
        if (DateChanged != null)
        {
            DateChanged(this, EventArgs.Empty);
        }
    }

    public DateTime SelectedDate
    {
        get
        {
            return (object)ViewState["SelectedDate"] != null ? (DateTime)ViewState["SelectedDate"] : DateTime.MinValue;
        }
        protected set
        {
            ViewState["SelectedDate"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
   
    protected void Calendar1_SelectionChanged(object sender, EventArgs e)
    {
        PopupControlExtender.GetCurrent(this.Page).Commit(Calendar1.SelectedDate.ToShortDateString());
        SelectedDate = Calendar1.SelectedDate;
        OnDateChanged();
    }

    public void ClearDate()
    {
        this.DateTextBox.Text = String.Empty;
        this.UpdatePanel1.Update();
    }
}


Og en side:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CalendarPage.aspx.cs" Inherits="CalendarPage" %>

<%@ Register Src="UserControls/CalendarStuff.ascx" TagName="CalendarStuff" TagPrefix="uc1" %>

<!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">
        <atlas:ScriptManager ID="sm" runat="server" EnablePartialRendering="true"></atlas:ScriptManager> 
        <br />
        <uc1:CalendarStuff ID="CalendarStuff1" runat="server" OnDateChanged="cal_DateChanged" />
        <br />
        <br />
        <uc1:CalendarStuff ID="CalendarStuff2" runat="server" OnDateChanged="cal_DateChanged" />
        <br />
        <br />
        <uc1:CalendarStuff id="CalendarStuff3" runat="server">
        </uc1:CalendarStuff>
    </form>
</body>
</html>

Og koden til den:
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 CalendarPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void cal_DateChanged(object sender, EventArgs e)
    {
        if (sender == CalendarStuff1)
        {
            DateTime selectedDate1 = CalendarStuff1.SelectedDate;
            DateTime selectedDate2 = CalendarStuff2.SelectedDate;
            if (selectedDate1 < selectedDate2)
            {
                CalendarStuff2.ClearDate();
                CalendarStuff2.ClearDate();
            }
        }       
    }
}

Det er ikke fordi den gør nøjagtig det du har bedt om - men klodserne til det skulle være der.... Så må du selv fikse logikken op.

Mvh
Avatar billede travelnow Nybegynder
12. oktober 2006 - 09:45 #12
Tak for eksemplet, det ser ellers lovende ud, men jeg kan ikke få det til at virke, jeg kan kompilere og starte, og når jeg trykker i tekstboksen kommer kalenderen op, jeg vælger en dato, kalenderen lukker, men datoen bliver ikke skrevet i tekstboksen. Jeg har selvfølgelig prøvet flere forskellige ting, men uden held.

Jeg går ud fra det virker hos dig, så kan du ikke zippe projektet og sende det til hvoreranykey@hotmail.com.
Skriv lige en kommentar her, hvis du sender det, da jeg normal ikke tjekker min hotmail.
Avatar billede snepnet Nybegynder
12. oktober 2006 - 11:17 #13
Det er sendt.
Mvh
Avatar billede travelnow Nybegynder
12. oktober 2006 - 15:56 #14
Dit projekt virker fint, men jeg kan simpelhen ikke få det til at virke i mit nuværende projekt, den har stadig den fejl jeg beskrev sidst. Og jeg synes ellers at jeg har prøvet alt nu, jeg har kopieret dine filer direkte ind i projektet og includeret dem, har prøvet at oprette dem mauelt, sådan at alle referencer bliver sat automatisk, men uanset hvad jeg gør, er fejlen den samme.
Hvis jeg opretter et nyt projekt, kan jeg sagtens få det til at virke, men det burde jo ikke være nødvendig at starte forfra, og desuden er projektet under sourcekontrol, så det vil være noget være bøvl.

Men konklusionen må åbenbart være at der er noget i det nuværende projekt der gør at det ikke vil virke, men hvad, jeg kan simpelhen ikke regne det ud.

Har du en ide til hvad der kan være galt??

Men uanset, så kom med et svar så du kan få dine velfortjente point, da dit svar jo virker perfekt.
Avatar billede snepnet Nybegynder
12. oktober 2006 - 16:12 #15
Hmm... Jeg ved det ikke. Måske har du ikke EnablePartialRendering på din ScriptManager, og Mode=Conditional i dine updatepanels?
Har du checket om det er samme version af assemblies vi bruger?
Mvh
Avatar billede snepnet Nybegynder
12. oktober 2006 - 16:12 #16
Hov - og svaret :o)
Mvh
Avatar billede travelnow Nybegynder
13. oktober 2006 - 13:16 #17
JUBIII!!!

Endelig virker det, det var simpelhen, som du også er inde på, pga. en gammel version af AtlasControlToolkit, men det var netop en af de første ting jeg prøvede, altså her for en uges tid siden, men jeg regnede sådan set ikke med at fejlen lå der, så jeg hentede bare den nyeste, overskrev den gamle m.m. og det virkede så ikke, og da jeg ikke regnede med at fejlen lå der, undersøgte jeg det ikke nærmere.

Men nu her hvor jeg tjekkede alt igennem igen, så jeg til min rædsel at den gamle version af AtlasControlToolkit.dll var kommet tilbage, jeg overskrev den så igen med den nye, men den gamle kom igen tilbage når jeg kørte projektet og det skyldes at projektet er under sourcecontrol. Men værste er at normalvis kan man sagtens erstatte en fil med en anden, det er kun hvis man via sourcekontrol siger get latest version den henter filerne igen, men dette gælder åbenbart ikke for dll'er. Og det er eddermame surt show, med al den tid jeg har brugt på det.

Men nu virker det bare, så det er sgu fedt.

Og stor tak til dig, du er åbenbar vild med vanskelige problemstillinger, når du ligger så meget energi i at hjælpe andre.
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