Finne hvilken kontroll som har ført til Postback av siden

No comments

Av og til er det nødvendig å kunne sjekke hvilken kontrollsom førte til postback.

Det kan f.eks være en side med mange egendefinerte filtreosv, med egendefinert databinding,

hvor hvis man ventet til Eventhandleren for Button ellerDropDown så ville man måtte hente data flere ganger osv.

Page_Load har jo object sender, og hvis man googler litt serman at flere foreslår å caste sender til button.

Det virker dessverre ikke. Når en knapp har postet er detsiden selv som står som sender.

Tilsvarende foreslår mange å bruke"__EventTarget".

Det fungerer fint for dropdowns osv., men igjen, for buttonsog kusinene vil denne ikke virke. Da er eventtarget tom/""

Løsningen for Button og dens venner er (dessverre) å loopeigjennom Request.Form, caste til control, og sjekke om det er en Button.

Hvis ja kan man slutte å loope, da den eneste gangen enbutton vil være i Request.Form-samlingen er hvis det er den som Postet siden.

Krøkkete men funker.

Her er i alle fall en util for å finne kontrollen som harpostet siden:

(en kollega har laget denne, jeg har bare utvidet den med enfiks for Imagebutton)


1 public static class Utils
2 {
3
4 /// <summary>
5 /// Denne funksjonen finne hvilken kontroll som har forårsaket postback på en side.
6 /// </summary>
7 /// <param name="page">Siden vi vil finne postback for</param>
8 /// <returns>Returnerer kontroll som har forårsaket postback</returns>
9 public static Control FinnPostbackControl ( Page page )
10 {
11 Control control = null;
12
13 //Kontroll som forårsaker postback ligger i _EVENTTARGET...
14 string ctrlName = page.Request.Params.Get("__EVENTTARGET");
15 if ( !String.IsNullOrEmpty(ctrlName) )
16 {
17 control = page.FindControl(ctrlName);
18 }
19 else
20 {
21 Control c; //bruker en temp controlholder slik at control==null hvis ikke funnet
22 //...utenom Button, den ligger i Request.Form (ingen andre knapper en postback-knappen vil ligge her)
23 foreach ( string str in page.Request.Form )
24 {
25 //fix for imagebutton-kontroller
26 if (str.EndsWith(".x") || str.EndsWith(".y"))
27 {
28 string nystr = str.Substring(0, str.Length - 2);
29 c = page.FindControl(nystr);
30 if (c is ImageButton)
31 {
32 control = c;
33 break;
34 }
35 }
36 else
37 {
38 c = page.FindControl(str);
39 if (c is Button)
40 {
41 control = c;
42 break;
43 }
44 }
45 }
46 }
47
48 return control;
49 }
50

No comments :

Post a Comment

Infragistics UltraWebChart og sti til ChartImages

No comments

Som default vil Infragistics opprette en ny chartImages i hver mappe hvor man har en side som benytter en chart-kontroll.

F.eks
/ChartImages
/Hendelser/ChartImages

osv.

For å styre disse mot samme mappe (f.eks når man har et cluster og må opprette en delt ressurs mellom nodene) må man endre properties for kontrollen.

Nå har UltraWebChart en property som heter ChartImagesPath.

Den er det selvfølgelig ikke…

I stedet må du lage en seksjon kalt: DeploymentScenario:

Her ser du koden jeg bruker for å samle alt i en felles mappe i rot:

<DeploymentScenario

FilePath="~/ChartImages/"
ImageURL="../ChartImages/RapportFront_#SEQNUM(100).png" />


Som du ser er det en fleksibel løsning hvor du kan angi navngivingsregler osv.

Denne vil lage bilder kalt RapportFront_0.png osv til RapportFront_99.png, deretter begynner telleren på nytt.

Tallet kan økes fra 100 til dine ønsker.

Du kan også bruke session_id i navngivingen, i kombinasjon med #seqnum, eller i stedet for.

Da heter variabelen #SESSION


For en chart-kontroll et nivå under roten vil det kunne se slik ut:

<igchart:UltraChart ID="UltraChart1" runat="server" BorderWidth="0px" Width="750px"

Version="8.2" BackColor="" ForeColor="Black" >

<DeploymentScenario

FilePath="~/ChartImages/"

ImageURL="../ChartImages/RapportFront_#SEQNUM(100).png"

/>

<Tooltips Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Strikeout="False"

Font-Underline="False" />

………../>

NB. i første versjon av posten hadde jeg med variabelen #EXT som erstatning for filtypen (.png i eksempelet over.)

Da den ikke virket men ga meg filnavn som faktisk sluttet med .#EXT så har jeg fjernet denne nå.

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

c#/Asp.Net: Objectdatasource

No comments

Strevde med å få en Objectdatasource til å virke i Designmode.

 

Trikset var: bruk properties i stedet forfields i ditt Business Object.

 

Hvis ikke får du ikke Design-time goodness :)

 

Her er kode som virker:

(metoder osv er forenklet for å illustrere konseptet uten ågjøre eksempelet for stort)

 

 

.CS (bør ligge i App_Code)

 

 

Mitt dataobjekt som altså nå har properties:

 

 

    public class RapportPeriode

    {

        public string Type {get;set;}

        public int HendelseTypeID {get;set;}

        public int Totalt {get;set;}

 

    }

 

/*********************************************************************

            denne klassen kan ikke benyttes som utgangspunktfor Objectdatasource

            den har fields som verdier i stedet forproperties

    public class RapportPeriode

    {

        public string Type;

        public int HendelseTypeID;

        public int Totalt;

    }

 

*********************************************************************/

 

 

//Klasse du bruker mot Objektdatasource:

public class RapportHjelper

    {

    

        public List<RapportPeriode> GetData(int År)

        {

 

               List<RapportPeriode> liste = newList<RapportPeriode>();

 

 

                RapportPeriode rad = new RapportPeriode();

                rad.Type = "Totalt"

                rad.HendelseTypeID = 0;

                rad.Totalt = 100;

 

                liste.Add(rad);

 

                rad = new RapportPeriode();

                rad.Type = "Noe "

                rad.HendelseTypeID = 1;

                rad.Totalt = 7;

 

                liste.Add(rad);

       

                return liste;           

 

        }

 

}

 

 

 

 

.ASPX:

 

          <asp:GridView ID="GridView1"runat="server" DataSourceID="ds"

                AutoGenerateColumns="False">

                <Columns>

                    <asp:BoundFieldDataField="Type" HeaderText="Type"SortExpression="Type" />

                    <asp:BoundFieldDataField="HendelseTypeID" HeaderText="HendelseTypeID"

                        SortExpression="HendelseTypeID"Visible="false" />

                    <asp:BoundFieldDataField="Totalt" HeaderText="Totalt"

                        SortExpression="Totalt"/>

                </Columns>

            </asp:GridView>

     

          

    <asp:ObjectDataSource

        ID="ds" runat="server"

        SelectMethod="GetData"

        typename="RapportHjelper" >

       

        <SelectParameters>

            <asp:ControlParameterControlID="lblPeriode" DefaultValue="DateTime.Now.Year"

                Name="År"PropertyName="Text" Type="Int32" />

        </SelectParameters>

    </asp:ObjectDataSource>

 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

Javascript: pause/vent til bruker er ferdig med å skrive før funksjon kalles

No comments

Denne venter mens brukeren skriver, og etter en selvbestemtpause (750ms i dette tilfellet) kalles en funksjon:

(Brukes f.eks sammen med Ajax for å filtrere mens manskriver osv)

 

Jeg bruker denne slik på en textbox:

 

<input name="filterAktoernummer"type="text" id=" filterAktoernummer" onkeyup="VentOppdater(this);"/>

 

 

 

 

<script language="javascript">

   

      var count = 0;

 

      /* kjører kun oppdatering/spørring når bruker harsluttet å skrive*/

      function VentOppdater(txtbox)

      {

         count = count+1;

         setTimeout("VentOk("+count+",'"+ txtbox.id +"','" + txtbox.value + "')",750);

      }

 

      

      function VentOk(currCount,myid,verdi)

      {

         if(currCount == count)

         {

            count = 0;

            Oppdater(myid,verdi);

         }

      }

 

 

    function Oppdater(id,verdi)

    {

            /*Her kjøres det filtrering etc som du ønsker skalskje når bruker har sluttet/pauset skrivingen*/

 

    }

   

 

   

</script>

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

C#: Lagre objekt til cookie

No comments
 
    /// <summary>
    /// util for å serialize /deserialize objekter til cookies
    /// </summary>
    public static class CookieUtils
    {
 
        /// <summary>
        /// Henter satt cookie som object, returnerer null hvis cookie ikke finnes
        /// </summary>
        /// <param name="navn"></param>
        /// <returns></returns>
        public static T GetCookie<T>(string navn) where T : class, new()
        {
            StringReader stream;
 
            try
            {
 
                HttpCookie c = HttpContext.Current.Request.Cookies[navn];
                if (c == null || string.IsNullOrEmpty(c.Value))
                    return default(T);
 

                string[] verdier = c.Value.Split('|');
                int n = 0;
 
                T objekt = new T();
 
                Type type = objekt.GetType();
                //Type type = objekt.GetType();
                FieldInfo[] felter = type.GetFields();
                foreach (FieldInfo feltinf in felter)
                {
                    feltinf.SetValue(objekt, verdier[n++]);
                }
 
                PropertyInfo[] props = type.GetProperties();
                foreach (PropertyInfo propinf in props)
                {
                    SetProperty(propinf, verdier[n++], objekt);
                }
 
 
 
                return objekt;
            }
            catch (Exception ex)
            {
                throw new BasisException(ex);
            }
 

        }
        /// <summary>
        /// Lager cookie av gjeldende objekt som utløper om 10 timer
        /// </summary>
        /// <param name="navn"></param>
        /// <param name="objekt"></param>
        public static void SetCookie(string navn, object objekt)
        {
            SetCookie(navn, objekt, DateTime.Now.AddHours(10));
        }
 
        /// <summary>
        /// Lager cookie av gjeldende objekt
        /// </summary>
        /// <param name="navn"></param>
        /// <param name="objekt"></param>
        /// <param name="utløper"></param>
        public static void SetCookie(string navn, object objekt, DateTime utløper)
        {
 

            try
            {
 
                StringBuilder streng = new StringBuilder();
                Type type = objekt.GetType();
                FieldInfo[] felter = type.GetFields();
                foreach (FieldInfo feltinf in felter)
                {
                    if (feltinf != null)
                    {
                        object verdi = feltinf.GetValue(objekt);
                        streng.Append(verdi.ToString() + "|");
 
                    }
                }
 
                PropertyInfo[] props = type.GetProperties();
                foreach (PropertyInfo propinf in props)
                {
                    if (propinf != null)
                    {
                        object verdi = propinf.GetValue(objekt, null);
                        streng.Append(verdi.ToString() + "|");
                    }
                }
 
                HttpCookie c = new HttpCookie(navn, streng.ToString());
 
                c.Expires = utløper;
 
                if (HttpContext.Current.Request.Cookies[navn] != null)
                    //finnes fra før
                    HttpContext.Current.Response.Cookies.Set(c);
                else
                    //finnes ikke, lag ny
                    HttpContext.Current.Response.Cookies.Add(c);
 
            }
            catch (Exception ex)
            {
                throw new BasisException(ex);
            }
        }
 

        /// <summary>
        /// sletter en satt cookie
        /// (resetter verdi og setter utløpsdato tilbake i tid)
        /// </summary>
        /// <param name="navn"></param>
        public static void SlettCookie(string navn)
        {
            //tømmer verdi og setter utløpt for ett år siden
            HttpCookie c = new HttpCookie(navn, "");
            c.Expires = DateTime.Now.AddYears(-1);
 
            if (HttpContext.Current.Request.Cookies[navn] != null)
                //finnes fra før
                HttpContext.Current.Response.Cookies.Set(c);
 
        }
 

        /// <summary>
        /// Hjelpemetode for å sette en verdi via reflection etc
        /// </summary>
        /// <param name="pInfo"></param>
        /// <param name="propertyName"></param>
        /// <param name="propertyValue"></param>
        /// <param name="control"></param>
        /// <param name="objectToSetValue"></param>
        private static void SetProperty(PropertyInfo pInfo, string propertyValue, object objectToSetValue)
        {
            Type pType = pInfo.PropertyType;
 
            if (pType == typeof(string))
                pInfo.SetValue(objectToSetValue, propertyValue, null);
            else if (pType == typeof(bool))
                pInfo.SetValue(objectToSetValue, Convert.ToBoolean(propertyValue), null);
            else if (pType == typeof(int))
                pInfo.SetValue(objectToSetValue, Convert.ToInt32(propertyValue), null);
            else
                throw new NotImplementedException("Objektet har felttype som ikke er implementert enda..");
        }
    }
 
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment

SQL: Oppdatere en tabell basert på en annen

No comments

Setter Eier for Hendelse lik HendelseEier i tabellen HendelseInformasjon.
 
Merk at at en HendelseInformasjonId i HendelseInformasjon kan inneholde mange relaterte poster i Hendelse.
Alle disse vil da bli oppdatert.
 
UPDATE    Hendelse
SET              Eier =
                          (SELECT     HendelseEier
                            FROM          HendelseInformasjon
                            WHERE      (Hendelse.HendelseInformasjonId = HendelseInformasjonId))
 
 
Struktur:
 

Posted by email from Henris blogg (posterous)

No comments :

Post a Comment