Jump to content

Erro Windows Phone Universal App ao chamar função async OnNavigatedTo


Hitmanpt
 Share

Go to solution Solved by Hitmanpt,

Recommended Posts

Boas no meu código do Windows Phone MainWindow tenho este código

namespace Balcão_Virutal_UBI
{
public sealed partial class MainPage : Page
{
	public bool hasloggin = false;
	public MainPage()
	{
		this.InitializeComponent();
		this.NavigationCacheMode = NavigationCacheMode.Required;
	}
	private async void fetchInfo()
	{
		FetchData fd = new FetchData();
		Dictionary<string, string> schedule = await fd.GetSchedule_HC("12", "ui");
		foreach (KeyValuePair<string, string> entry in schedule)
		{
			horario.Items.Add(entry.Key + "|" + entry.Value);
		}
	}

	protected override void OnNavigatedTo(NavigationEventArgs e)
	{
		fetchInfo();
	}
}
}

E a função a ser chamada está no "Shared" ou seja código a ser utilizador tanto pela App do Windows 8.1 e do Windows Phone 8.1 é a seguinte

HtmlWeb htmlW;
public async Task<Dictionary<string, string>> GetSchedule_HC(string day, string week)
{
	string year = "21"; //get from settings
	string semestre = "S1"; //get from settings
	string ciclo = "1"; //get from settings
	string course = "1408"; //get from settings
	string url = "https://academicos.ubi.pt/online/horarios.aspx?p=a";
	string cicleY = "1"; //get from settings
	htmlW = new HtmlWeb();
	HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);
	IEnumerable<HtmlNode> selectElm = from selectNode in htmlDoc.DocumentNode.Descendants()
									  where selectNode.Name == "select" && selectNode.GetAttributeValue("id","") == "ContentPlaceHolder1_ddlAnoLect"
									  select selectNode;
	Dictionary<string, string> rtnval = new Dictionary<string,string>();
	foreach (HtmlNode node in selectElm)
	{
		rtnval.Add(node.Attributes["value"].Value, node.InnerText);
	}
	return rtnval;
}

E quando executo a aplicação obtenho um erro desconhecido que aponta para esta linha no ficheiro "App.cs"

global::System.Diagnostics.Debugger.Break();

Já usei uma message box em vez da lista mas o problema preciste.

Se ao menos houver alguma maneira de mostrar o erro já é uma grande ajuda

Link to comment
Share on other sites

nao sera' quantas vezes estas a chamar a funcao GetSchedule_HC?

o problema pode estar nestas linhas de codigo

//HtmlWeb htmlW;

//....

//htmlW = new HtmlWeb(); //troca por
var htmlW = new HtmlWeb();

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

provavel que seja problema daqui:

HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);
               IEnumerable selectElm = from selectNode in htmlDoc.DocumentNode.Descendants()
                                                                                 where selectNode.Name == "select" && selectNode.GetAttributeValue("id","") == "ContentPlaceHolder1_ddlAnoLect"
                                                                                 select selectNode;

Sera' que nao consegues uma expressao regular para teres os valores selecionados?

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Alterei o meu código da função GetSchedule_HC para

HtmlWeb htmlW;
	public async Task<Dictionary<string, string>> GetSchedule_HC(string day, string week)
	{
		string year = "21"; //get from settings
		string semestre = "S1"; //get from settings
		string ciclo = "1"; //get from settings
		string course = "1408"; //get from settings
		string url = "https://academicos.ubi.pt/online/horarios.aspx?p=a";
		string cicleY = "1"; //get from settings

		htmlW = new HtmlWeb();
		HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);
		HtmlNode selectNode;
		Dictionary<string, string> rtnval = new Dictionary<string, string>();
		foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
		{
			if (node.Name == "select" && node.GetAttributeValue("id", "") == "ContentPlaceHolder1_ddlAnoLect")
			{
				selectNode = node;

				foreach (HtmlNode optNode in selectNode.Descendants())
				{
					rtnval.Add(optNode.Attributes["value"].Value, optNode.InnerText);
				}
			}
		}
		//IEnumerable<HtmlNode> selectElm = from selectNode in htmlDoc.DocumentNode.Descendants()
		//								  where selectNode.Name == "select" && selectNode.GetAttributeValue("id", "") == "ContentPlaceHolder1_ddlAnoLect"
		//								  select selectNode;

		return rtnval;
	}

O mesmo problema, pelos vistos break points não funcionam ou isso ou nem sequer chega ao primeiro foreach

Não fazia intenção de usar expressões regulares pois torna o código um pouco mais confuso

PS: A mudança da variavel como eu suspeitava não fez absolutamente nada

Edited by Windows Dragon
Link to comment
Share on other sites

foreach(HtmlNode node in selectElm)
		{
			var val = node.Attributes["value"];
			if(val == null)
				throw new Exception("Value == null!!");
			rtnval.Add(node.Attributes["value"].Value, node.InnerText);
		}

Corre a aplicacao em modo debug e com as flags de debug

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Consegui fazer breakpoint até

HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);

Aqui é onde está a ser criado o erro pelos vistos

Dictionary<string, string> rtnval = new Dictionary<string, string>();

EDIT: Parece que afinal não é o problema... Editei o codigo para devolver um HtmlNodeCollection e e da erro sempre no que estiver a seguir ao HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);

Edited by Windows Dragon
Link to comment
Share on other sites

experimenta assim:

//....
string htmlPage = "";
using(var wp = new HttpClient())
{
 htmlPage = await xx.GetStringAsync(url);
}
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc .LoadHtml(htmlPage);

//HtmlDocument htmlDoc = await htmlW.LoadFromWebAsync(url);
HtmlNode selectNode;
//etc...

Codigo NAO testado!

http://stackoverflow.com/questions/8942595/parsing-html-with-htmlagilitypack

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Bem resolveu algo... mas continual algo mal...

Eu movi a função "fetchInfo" da main window para o evento loaded e apliquei o fix que me deste

public async Task<Dictionary<string,string>> GetSchedule_HC(string day, string week)
    {
	    string year = "21"; //get from settings
	    string semestre = "S1"; //get from settings
	    string ciclo = "1"; //get from settings
	    string course = "1408"; //get from settings
	    string url = "https://academicos.ubi.pt/online/horarios.aspx?p=a";
	    string cicleY = "1"; //get from settings

           string htmlPage;
	    using(var wp = new HttpClient())
	    {
		    htmlPage = await wp.GetStringAsync(new Uri(url));
	    }
	    HtmlDocument htmlDoc = new HtmlDocument();
	    htmlDoc.LoadHtml(htmlPage);
	    Dictionary<string, string> rtnval = new Dictionary<string, string>();
	    HtmlNodeCollection selectNode = htmlDoc.GetElementbyId("ContentPlaceHolder1_ddlAnoLect").ChildNodes;

	    foreach (HtmlNode optNode in selectNode)
	    {
		    rtnval.Add(optNode.Attributes["value"].Value, optNode.InnerText); //erro aqui algures
	    }

	    //IEnumerable<HtmlNode> selectElm = from selectNode in htmlDoc.DocumentNode.Descendants()
	    //								  where selectNode.Name == "select" && selectNode.GetAttributeValue("id", "") == "ContentPlaceHolder1_ddlAnoLect"
	    //								  select selectNode;
	    return rtnval;
    }

Agora eu estive a fazer step by step e na linha que marquei é onde existe o problema... Mas pelo menos a UI da App já me apareçe

Link to comment
Share on other sites

//rtnval.Add(optNode.Attributes["value"].Value, optNode.InnerText); //erro aqui algures
if(optNode.Attributes["value"]!=null)
 rtnval.Add(optNode.Attributes["value"].Value, optNode.InnerText);

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

  • Solution

Como estava a fazer step by step apercebi-me que nem todos os elementos eram option adicionei este bloco que aparentemente corrigiu tudo

if (optNode.Name == "option")
			{
				string txt = optNode.NextSibling.InnerText;
				string val = optNode.Attributes["value"].Value;
				rtnval.Add(val,txt);
			}

Isto dentro do foreach

Fiz apenas mais um teste sem breakpoints tudo sem problemas

Muito obrigado pela tua ajuda

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.