Hejsan,
Om jag har en metod, createXPathDoc(), där jag skapar en XPathNavigator och vill att det objektet ska vara tillgängligt för andra metoder, hur gör jag då..?
Jag provade att skapa en global variabel
private XPathNavigator m_theXPathNavigator;
och sedan
public XPathNavigator theXPathNavigator
{
get{return this.m_theXPathNavigator;}
set{this.m_theXPathNavigator = value;}
}
private void createXPathDoc()
{
...
XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();
theXPathNavigator = myXPathNavigator;
}
createXPathDoc() anropar jag i Page_Load()
sen i verifyDate() vill jag använda variabeln och skriver då
public Boolean verifyDate()
{
XPathNavigator myXPathNavigator = theXPathNavigator;
...
får felmeddelande:
System.NullReferenceException: Object reference not set to an instance of an object.
... funderade på om det var så att värdet försvann när jag anropade verifyDate (jag klickar på en knapp för att anropa funktionen, så kanske värdet i den globala variabeln inte är kvar då?)
Jag provade att lägga alla förekomster av theXPathNavigator som ViewState istället, så att jag t.ex. fick
public Boolean verifyDate()
{
XPathNavigator myXPathNavigator = (XPathNavigator)ViewState["theXPathNavigator"];
...
men då fick jag ett annat felmeddelande..
The type 'System.Xml.XPath.XPathDocumentNavigator' must be
marked as Serializable or have a TypeConverter other than
ReferenceConverter to be put in viewstate.
renholmMedlem sedan apr. 20012 266 inlägg Genom att objekt i ViewState görs de bara tillgängliga mellan olika postbacks. För att deklarera "globala" måste du lägga den utanför din funktion i klassen.
Hej, tackar... jag försökte fixa det imorse men kom inte på nåt..
Genom att objekt i ViewState görs de bara tillgängliga mellan olika postbacks
hmm.. du menar att om det inte är fråga om postback så syns de inte eller..? Vad gäller det senare felmeddelandet ang. ViewState iaf, så fanns en del på nätet men jag kan för lite för att förstå lösningarna..
ex:
Gotdotnet
But, for some reason, it won't work unless I implement ISerializable.
det lät för svårt med tanke på vad jag ville göra hur som helst..?
Jag postar delar av koden så som det ser ut i sin helhet så kanske det blir enkelt o se hur jag menar..
public class WebForm1 : System.Web.UI.Page
{
private XPathNavigator m_theXPathNavigator;
public XPathNavigator theXPathNavigator
{
get{return this.m_theXPathNavigator;}
set{this.m_theXPathNavigator = value;}
}
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.Page.IsPostBack)
{
//ViewState["theXPathNavigator"] = null;
theXPathNavigator = null;
this.createXPathDoc(); //sätter theXPathNavigator variabeln
}
}
private void calBooking_SelectionChanged(object sender, System.EventArgs e)
{
[B]//Om jag skriver ut värdet på theXPathNavigator här så fungerar det
//men efter nedanstående anrop försvinner värdet på variabeln.
//Jag gissar att det beror på att det skedde en PostBack?[/B]
this.verifyDate();
...
}
private void createXPathDoc()
{
...
try
{
XPathDocument myXPathDocument = new XPathDocument(this.getXmlDoc(xmlDoc));
XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();
//ViewState["theXPathNavigator"] = myXPathNavigator;
theXPathNavigator = myXPathNavigator;
...
}
catch(Exception e){this.lblShowXml.Text += "Exception " + e.ToString();}
}
public Boolean verifyDate()
{
//XPathNavigator myXPathNavigator = (XPathNavigator)ViewState["theXPathNavigator"];
XPathNavigator myXPathNavigator = theXPathNavigator;
....
}
}
Så om jag kan få värdet av theXPathNavigator till verifyDate() blir jag glad.. :) Jag kanske har gjort något grundläggande fel.. finns det andra sätt kanske..? Jag kan tillägga att jag inte har några problem att få det att fungera om jag från calBooking_SelectionChanged anropar createXPathDoc och därifrån direkt anropar verifyDate
private void createXPathDoc()
{
...
try
{
XPathDocument myXPathDocument = new XPathDocument(this.getXmlDoc(xmlDoc));
XPathNavigator myXPathNavigator = myXPathDocument.CreateNavigator();
verifyDate(myXPathNavigator);
...
}
catch(Exception e){}
}
fast då skapas ju en ny XPathNavigator varje gång SelectionChanged inträffar.. hoppas att det kanske finns ett mycket enkelt sätt som jag inte förstod bara..? :)
renholmMedlem sedan apr. 20012 266 inlägg Exakt vad vill du åstakomma? Blir lättare att hjälpa och hitta alternativa lösningar då.
Tack för att du tar dig tid :) Jag ska försöka beskriva så utförligt som möjligt:
Syfte med applikationen:
- En kalender som låter användaren boka en viss tid vid ett visst datum.
- Man använder sig av en kalendern som visar år, månad, och dag.
- Till höger om kalendern finns 24 checkboxar, en för varje timme.
- För att boka klickar man den dag man är intresserad av och sedan så klickar man i de tider man vill boka.
- Om någon annan redan har bokat en viss tid, ett visst datum så ser man det genom att de aktuella checkboxarna är ikryssade (samt att namnet av personen som bokat står bredvid den ifyllda checkboxen).
- ”Databasen” där bokningarna lagras består av en XML fil.
Metoder:
- Ladda XML filen med getXmlDoc()
- För att söka igenom XML filen använder jag XPath. För detta ändamål har jag createXPathDoc() som skapar ett XPathDocument samt en XPathNavigator.
- För att kontrollera om ett visst datum i kalendern innehåller bokade tider så använder jag verifyDate(). Den har jag lagt in i kalenderns SelectionChanged() metod, så att den anropas varje gång man klickar ett visst datum i kalendern.
- verifyDate() använder sig av XPathNavigator som skapades i createXPathDoc().
Jag misslyckades alltså när jag ville ge verifyDate tillgång till XPathNavigator och det var det som jag ville ha hjälp med.. :) Om det är något mer jag kan förklara eller förtydliga gör jag det gärna.
renholmMedlem sedan apr. 20012 266 inlägg Eftersom System.Xml.XPath.XPathDocumentNavigator måste vara markerad som Serializable vilket den inte är kan du inte lägga den i ViewState, därför får du ladda den i Page_Load varjegång. På så sätt kommer detan vara tillgänglig även efter postbacks, och du kan då verifera datum och dyl.
Hejsan.. tackar.. japp, det fungerar utan problem så... :) Men jag tänkte att eftersom min XML fil ju är min databas, är det ungefär som att min "databas" laddas för varje postback.. om jag hade haft en traditionell dB, hade jag ju kanske lagt kopplingen i web.config, o kanske använt Global.asax.. men jag hittade inga exempel på om man kunde göra samma sak med XML fil.. eller om man brukade göra så..? Nån som vet..?
I annat fall kör jag såsom du föreslog.. det funkar fint :)
tack för hjälpen !! :)
renholmMedlem sedan apr. 20012 266 inlägg Bra att det fungera. Alternativet är väl att cacha datan, dock tror inte jag det passar i ditt fal då du måste ha uppdaterad information hela tiden.