C# tekst van een website krijgen

Status
Niet open voor verdere reacties.
Nadat ik deserializeList.Remove heb gebruikt zijn er nog steeds evenveel favorieten hoe los ik dit op?

[CPP]

private async void Favorite_Click(object sender, RoutedEventArgs e)
{
Favorieten favorieten = new Favorieten(naamspel, parameter);


if (favoriet.IsChecked == true)
{
await writeXMLAsync();
}
else if (favoriet.IsChecked == false )
{
await editXMLAsync();


}

}




private List<Favorieten> editObjectGraph()
{
deserializedList.Remove(favorieten);
Debug.WriteLine(deserializedList.Count());
Debug.WriteLine("REMOVED {0}", favorieten);

return deserializedList;
}

private async Task editXMLAsync()
{
var favorites = editObjectGraph();

var serializer = new DataContractSerializer(typeof(List<Favorieten>));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
XMLFILENAME,
CreationCollisionOption.ReplaceExisting))
{
serializer.WriteObject(stream, favorites);
}

MessageDialog messageDialog = new MessageDialog("" + naamspel + " is verwijderd uit de favorieten");
messageDialog.ShowAsync();
}
[/CPP]
 
Hier kun je hetzelfde doen als bij het controleren of hij al aanwezig is.

Waarom het niet werkt:

Als je een new Favorite() object maakt met de naam 'Spel' is dit een nieuw instance. Als je dan nog een new Favorite() maakt met weer de naam 'Spel' met je een tweede instance. Ze hebben wel dezelfde naam maar het is een ander object (denk bijvoorbeeld dat je ze favorite1 en favorite2 noemt).

Als je een directe reference nog hebt naar een item uit de lijst kun je dat wel vergelijken. Zo niet, dan moet je het vergelijken op een andere manier zoals je vaak ziet met een ID of een GUID.

Ik had al gekeken op de website maar daar hebben ze geen ID wat je kunt parsen dus moet je ze wel met de naam vergelijken.





Om voor je zelf eens te kijken wat hetzelfde is en wat niet kun je gewoon eens een applicatie maken die wat vergelijkingen doet om het voor jezelf duidelijk te maken.


notepad voorbeeld: (kun je eenvoudig testen in een console application, niet nodig om een UI te maken, en dan kun je Console.WriteLine gebruiken)


Code:
var favoriteA = new Favorite("Spel Naam A");
var favoriteB = new Favorite("Spel Naam B");
var favoriteC = new Favorite("Spel Naam C");

var favorites = new List<Favorite>();
favorites.Add(favoriteA);
favorites.Add(favoriteB);
favorites.Add(favoriteC);


Hier heb je de references naar de favorite objects nog dus kun je eenvoudig:

if(favorites.Contains(favoriteA))
{
	Debug.WriteLine("favorites.Contains(favoriteA) is TRUE");
}
else
{
	Debug.WriteLine("favorites.Contains(favoriteA) is FALSE");
}


var newFavoriteA = new Favorite("Spel Naam A");

if(favorites.Contains(newFavoriteA))
{
	Debug.WriteLine("favorites.Contains(newFavoriteA) is TRUE");
}
else
{
	Debug.WriteLine("favorites.Contains(newFavoriteA) is FALSE");
}


bool foundSameName = false;
foreach(var favorite in favorites)
{
	if(favorite.Name == newFavoriteA.Name)
	{
		Debug.WriteLine("favorite.Name == newFavoriteA.Name is TRUE");
		foundSameName = true;
	}	
}

if(!foundSameName)
{
	Debug.WriteLine("same name not found in the collection");
}


Kijk maar eens wat hier uitkomt als je doet.
 
Kan dat dan ook gewoon zo?

[CPP]
foreach (var item in deserializedlist)
{
if(item.Spel == favoriet.Spel)
{
deserializedlist.Remove(item);
}

return deserializedlist;



}

[/CPP]
 
Met zo'n return in the loop zal je nooit bij het 2e item komen.
En als je tijdens een foreach loop een item wilt verwijderen krijg je een exception omdat je de lijst aan het wijzigen bent tijdens de loop.



dit kan bijvoorbeeld een oplossing zijn (notepad code):
Code:
int index = -1;
foreach(var item in deserializedlist)
{
	if(item.Spel == favoriet.Spel)
	{
		index = deserializedList.IndexOf(item);
		break;
	}
}

if(index != -1)
	deserializedlist.RemoveAt(index);

Hier zet je een index int als hij een spel met dezelfde naam heeft gevonden, dan break je uit de loop. Dan verwijder je het item op die index plaats.


Je moet het gewoon eens proberen in een console application, test programma maak een lijst met iets en kijk eens wat er gebeurt als je bepaalde dingen doet.
 
Was dat niet waar je de json kreeg? Kun je daar toch gewoon uit plukken?

Of even code van wat je nu hebt en wat niet lukt.
 
Ik haal van een site een tijd op van een formule 1 race, in de app geeft ie dan weer 10.00 - 11.00 (Nederlandse tijd)
Maar hoe kan ik ervoor zorgen dat die tijd wordt omgezet de tijd die de gebruiker in heeft gesteld op zijn mobiel, bijv als de gebruiker in Amerika woont dat er dan komt te staan 4.00 - 5.00
 
had even een vakantie break, maar zie ik ander topic dat je het al hebt opgelost :thumb:
 
wp_ss_20140907_0001.jpg

Alleen heeft iemand met een lumia 920 een probleem met de scaling van de Formula-One app. Op mijn Samsung Ativ S ziet er alles gewoon normaal uit en op een Lumia 520 ook

Hoe kan dit en hoe valt dit te oplossen?
 
Hoe kan ik cookies opslaan zodat de gebruiker niet steeds opnieuw hoeft in te loggen.
Ik heb nu dit maar dit werkt niet.

[CPP]
if (CookieCollection != null)
{

try
{
var serializer = new DataContractSerializer(typeof(HttpCookieCollection));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
XMLFILENAME,
CreationCollisionOption.ReplaceExisting))
{
serializer.WriteObject(stream, CookieCollection);
}
}
catch
{
Debug.WriteLine("NEE");
}
}[/CPP]

Kan ik de cookies überhaupt wel opslaan en hergebruiken?
 
Ik zou straks even in een project voor details kijken maar ik sla username/password op in de PasswordVault (Windows.Security.Credentials namespace) en gebruik een usersetting of de gebruiker zich wil aanmelden bij het starten van de app.

De cookies sla ik op in een account class samen met de username en wat andere zaken.
 
Gebruikers naam en wachtwoord zijn gelukt om op te slaan.

Maar hoe kan ik die cookies opslaan?
 
Ik sla ze op als variable in een class, en bij het opstarten automatisch inloggen (als gebruiker dit wil) (en dus weer de cookies laden). Ik sla ze dus niet op als bestand.
 
dit is een class die ik gebruikt, moet je zelf zoiets als dit maken. Je kunt bijvoorbeeld een account property op de App.cs maken zo heb ik het ongeveer gedaan zodat je op elke pagina bij de gegevens kunt.

[CPP]using System;
using System.Collections.ObjectModel;
using System.Net;
using Windows.Web.Http;

namespace Archives.Models
{
public class Account : ObservableObject
{
private string _username;
private bool _isAuthenticated;

public Account(string username, bool isAuthenticated, HttpCookieCollection cookieCollection)
{
_username = username;
_isAuthenticated = isAuthenticated;
HttpCookieCollection = cookieCollection;
}

public string Username
{
get { return _username; }
private set { SetProperty(ref _username, value); }
}
public bool IsAuthenticated
{
get { return _isAuthenticated; }
private set { SetProperty(ref _isAuthenticated, value); }
}

public HttpCookieCollection HttpCookieCollection { get; set; }

public void Clear()
{
Username = string.Empty;
IsAuthenticated = false;
HttpCookieCollection = null;
}
}
}[/CPP]
 
[CPP]
public HttpCookieCollection CookieCollection { get; set; }



private HttpCookieCollection buildObjectGraph()
{
return CookieCollection;
}

private async Task writeXMLAsync()
{
var favorites = buildObjectGraph();
var serializer = new DataContractSerializer(typeof(HttpCookieCollection));
using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(
XMLFILENAME,
CreationCollisionOption.ReplaceExisting))
{
serializer.WriteObject(stream, favorites);
}
}[/CPP]

Ik heb dit geprobeerd, maar het werkt niet.

Wat is hier fout aan?
 
Ik kan hier niet veel mee, Je buildObjectGraph geeft alleen de parameter cookiecollection terug, waarom gebruik je deze methode?
Gebruik in iedergeval geen nutteloze code en namen die iets anders omschrijven. Dat maakt het voor jezelf ook alleen maar lastig.

Dit is hetzelfde zonder de onnodige dingen.
[CPP]public HttpCookieCollection CookieCollection { get; set; }

private async Task SaveCookiesAsync()
{
var serializer = new DataContractSerializer(typeof(HttpCookieCollection));

using (var stream = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(XMLFILENAME, CreationCollisionOption.ReplaceExisting))
{
serializer.WriteObject(stream, this.CookieCollection);
}
}[/CPP]


Wat ik dus mis is waar je de CookieCollection een value geeft, anders is deze gewoon null en valt er niets op te slaan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan