Finne hvilken kontroll som har ført til Postback av siden
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)
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
Infragistics UltraWebChart og sti til ChartImages
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å.
c#/Asp.Net: Objectdatasource
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>
Javascript: pause/vent til bruker er ferdig med å skrive før funksjon kalles
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>
C#: Lagre objekt til cookie
/// util for å serialize /deserialize objekter til cookies
/// </summary>
public static class CookieUtils
{
/// 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;
{
if (c == null || string.IsNullOrEmpty(c.Value))
return default(T);
string[] verdier = c.Value.Split('|');
int n = 0;
//Type type = objekt.GetType();
FieldInfo[] felter = type.GetFields();
foreach (FieldInfo feltinf in felter)
{
feltinf.SetValue(objekt, verdier[n++]);
}
foreach (PropertyInfo propinf in props)
{
SetProperty(propinf, verdier[n++], 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));
}
/// 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
{
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() + "|");
}
foreach (PropertyInfo propinf in props)
{
if (propinf != null)
{
object verdi = propinf.GetValue(objekt, null);
streng.Append(verdi.ToString() + "|");
}
}
//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);
//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;
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..");
}
}
SQL: Oppdatere en tabell basert på en annen
SET Eier =
(SELECT HendelseEier
FROM HendelseInformasjon
WHERE (Hendelse.HendelseInformasjonId = HendelseInformasjonId))

No comments :
Post a Comment