C# tekst van een website krijgen

Status
Niet open voor verdere reacties.
Dit is een test method om aan de source te komen. Dus het stuk hoe je de source download kun je vervangen met hoe het hier gebeurt.
Het parsen blijft hetzelfde, ook moet je de juiste uri/url gebruiken want dit is de test uri.


vb:

dit:
[CPP]public async Task<string> GetCompetitionUrlAsync(string teamUrl)
{
Debug.WriteLine("GetCompetitionUrlAsync");
Debug.WriteLine("\tfrom url:{0}", teamUrl);

using (var client = new HttpClient())
{
var source = await client.GetStringAsync(new Uri(teamUrl));

var doc = CreateDocument(source);

var urlNodes = SelectNode(doc.DocumentNode, "div", "id", "Tekstpagina");

var competitionUrl = urlNodes.Descendants("a").Skip(1).First().GetAttributeValue("href", string.Empty);
//SelectNode(urlNodes, "a", string.Empty, string.Empty).GetAttributeValue("href", string.Empty).ToString();
competitionUrl = WebUtility.HtmlDecode(competitionUrl);
Debug.WriteLine("parsed competition url:{0}", competitionUrl);

return competitionUrl;
}

}[/CPP]


wordt:
[CPP]public async Task<string> GetCompetitionUrlAsync(string teamUrl)
{
Debug.WriteLine("GetCompetitionUrlAsync");
Debug.WriteLine("\tfrom url:{0}", teamUrl);

using (var filter = new HttpBaseProtocolFilter())
using (var client = new Windows.Web.Http.HttpClient(filter))
{
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 6.3; WOW64; rv:29.0) Gecko/20100101");
var source = await client.GetStringAsync(new Uri(teamUrl));

var doc = CreateDocument(source);

var urlNodes = SelectNode(doc.DocumentNode, "div", "id", "Tekstpagina");

var competitionUrl = urlNodes.Descendants("a").Skip(1).First().GetAttributeValue("href", string.Empty);
//SelectNode(urlNodes, "a", string.Empty, string.Empty).GetAttributeValue("href", string.Empty).ToString();
competitionUrl = WebUtility.HtmlDecode(competitionUrl);
Debug.WriteLine("parsed competition url:{0}", competitionUrl);

return competitionUrl;
}
}[/CPP]



(niet getest) je dumpt dus de oude System.Net.Http.HttpClient en gebruikt de nieuwe Windows.Web.Http.HttpClient

Als je de methods hebt aangepast kun je als het goed is dezelfde code gebruiken in w8.1 als bij wp8.1

Even backupje maken voor je de methods gaat aanpassen, ook al zijn het maar een paar regels. ;)

(bij mij werkt de test nu op w8 & wp8.1)


edit:

En de filter gebruikt: using Windows.Web.Http.Filters;
 
Laatst bewerkt:
Wat klopt hier niet aan? Want hier blijft de app maar crashen

[CPP]

var soort = MyStackpanel.Children.OfType<ComboBoxItem>().FirstOrDefault(c => c.IsSelected == true).Tag.ToString();

[/CPP]
 
Probeer het eens in stukken de zetten en debuggen zodat je ziet wat het allemaal is.
Als je zo'n lang statement gebruikt moet je er van uitgaan dat je altijd een iets vind (omdat je .Tag aanroept bij iets wat er mogelijk niet is)

[CPP]string soort = string.Empty;

var comboCollection = MyStackpanel.Children.OfType<ComboBoxItem>();
if(comboCollection.Count > 0)
{
var cmb = comboCollection.First(c => c.IsSelected);
if(cmb != null)
{
soort = cmb.Tag.ToString();
}
}[/CPP]
 
Hoe zorg ik eigenlijk dat ik de resultaten in een listview krijg met letters ertussen?

En ik ben er achter gekomen dat ie er niet achterkomt welke combobox geselecteerd, ook al heb ik er op eentje geklikt.
Hoe los ik dit op?

Het combobox probleem is inmiddels opgelost
 
Laatst bewerkt:
Even een stuk om goed door te nemen wat er zijn wat nieuwe dingen die je nog niet gebruikt hebt denk ik.

Heb wat namen van internet gebruikt voor test, ik zou dit even in een nieuwe test app testen met de person class!

voorbeeldje:

person: (dus de class die je wilt weergeven zoals team of nieuws etc)
[CPP]public class Person
{
public string Name { get; set; }

public Person(string name)
{
Name = name;
}
}[/CPP]

kant en klare grouplist class van msdn:
[CPP]public class AlphaKeyGroup<T>
{
const string GlobeGroupKey = "\uD83C\uDF10";

/// <summary>
/// The Key of this group.
/// </summary>
public string Key { get; private set; }

public List<T> InternalList { get; private set; }

/// <summary>
/// Public ctor.
/// </summary>
/// <param name="key">The key for this group.</param>
public AlphaKeyGroup(string key)
{
Key = key;
InternalList = new List<T>();
}

/// <summary>
/// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping.
/// </summary>
/// <param name="slg">The </param>
/// <returns>Theitems source for a LongListSelector</returns>
private static List<AlphaKeyGroup<T>> CreateDefaultGroups(CharacterGroupings slg)
{
List<AlphaKeyGroup<T>> list = new List<AlphaKeyGroup<T>>();

foreach (CharacterGrouping cg in slg)
{
if (cg.Label == "") continue;
if (cg.Label == "...")
{
list.Add(new AlphaKeyGroup<T>(GlobeGroupKey));
}
else
{
list.Add(new AlphaKeyGroup<T>(cg.Label));
}
}

return list;
}

/// <summary>
/// Create a list of AlphaGroup<T> with keys set by a SortedLocaleGrouping.
/// </summary>
/// <param name="items">The items to place in the groups.</param>
/// <param name="ci">The CultureInfo to group and sort by.</param>
/// <param name="getKey">A delegate to get the key from an item.</param>
/// <param name="sort">Will sort the data if true.</param>
/// <returns>An items source for a LongListSelector</returns>
public static List<AlphaKeyGroup<T>> CreateGroups(IEnumerable<T> items, Func<T, string> keySelector, bool sort)
{
CharacterGroupings slg = new CharacterGroupings();
List<AlphaKeyGroup<T>> list = CreateDefaultGroups(slg);

foreach (T item in items)
{
int index = 0;
{
string label = slg.Lookup(keySelector(item));
index = list.FindIndex(alphakeygroup => (alphakeygroup.Key.Equals(label, StringComparison.CurrentCulture)));
}

if (index >= 0 && index < list.Count)
{
list[index].InternalList.Add(item);
}
}

if (sort)
{
foreach (AlphaKeyGroup<T> group in list)
{
group.InternalList.Sort((c0, c1) => { return keySelector(c0).CompareTo(keySelector(c0)); });
}
}

return list;
}
}[/CPP]


usage:
[CPP]var items = new List<Person>
{
new Person("Hettie Stinebaugh"),
new Person("Genna Stuart"),
new Person("Laticia Applewhite"),
new Person("Olevia Wildes"),
new Person("Magnolia Yau"),
new Person("Williemae Nygaard"),
new Person("Zella Demaree"),
new Person("Ariana Wotton"),
new Person("Ciera Pucci"),
new Person("Delora Cutter"),
new Person("Selina Levin"),
new Person("Nichol Burrow"),
new Person("Demetra Guerette"),
new Person("Hortensia Gee"),
new Person("Garry Villareal"),
new Person("Clotilde Teske"),
new Person("Jenelle Omar"),
new Person("Delsie Zych"),
new Person("Leilani Whang"),
new Person("Elvina Kaczmarek"),
new Person("Dot Gimbel"),
new Person("Hyo Rumsey"),
new Person("Anneliese Fleig"),
new Person("Lila Fried"),
new Person("Deana Menchaca"),
new Person("Meagan Eleby"),
new Person("Kayla Kitson"),
new Person("Yulanda Chick"),
new Person("Christina Dawdy"),
new Person("Nova Rines"),
new Person("Bruce Phares"),
new Person("Lynnette Kouba"),
new Person("Collen Rorick"),
new Person("Laureen Childress"),
new Person("Terisa Mcwaters"),
new Person("Vinita Pickard"),
new Person("Felix Nappi"),
new Person("Shannan Barb"),
new Person("Fredricka Voorhees"),
new Person("Velva Woodside"),
new Person("Bethanie Almada"),
new Person("Lenna Gerrard"),
new Person("Maryjane Thibodeaux"),
new Person("Waltraud Hodgdon"),
new Person("Salena Balsley"),
new Person("Shaina Lapierre"),
new Person("Jina Gibb"),
new Person("Edwina Laseter"),
new Person("Cassey Lupo"),
new Person("Joaquina Dildy"),
};

var collection = AlphaKeyGroup<Person>.CreateGroups(items, p => p.Name, true);[/CPP]
De standaard lijst met items. Deze collection die je krijgt van AlphaKeyGroup<Person>.CreateGroups is gebonden aan de CollectionViewSource in de xaml page
De p=> p.Name is de property waarop je sort.

Voor de duidelijkheid: je maakt een lijst met daarin weer lijsten met de gesorteerde items en een groupname/key. (een List<AlphaKeyGroup<Person>> dus)


basis xaml: (in plaats van Source="{Binding Collection}" kun je hem ook wel een naam geven zoals je het nu nog doet en de source in code setten, maar binding is een stuk fijner om mee te werken)

De normale lijst zit in een semantic zoom deze heeft 2 standen; zoomed in en zoomed out. Zoomed In is je standaard lijst, en zoomed out is de lijst met alle letters. Kun je gewoon stylen zoals je wilt. (hier simpele styling)
Code:
<Page.Resources>
	<CollectionViewSource x:Key="CollectionSource" IsSourceGrouped="True" ItemsPath="InternalList" Source="{Binding Collection}"/>
</Page.Resources>


<Grid>
	<SemanticZoom>
		<SemanticZoom.ZoomedInView>
			<ListView ItemsSource="{Binding Source={StaticResource CollectionSource} }">
				<ListView.ItemTemplate>
					<DataTemplate>
						<TextBlock Text="{Binding Name}" Style="{StaticResource ListViewItemContentTextBlockStyle}" />
					</DataTemplate>
				</ListView.ItemTemplate>
				<ListView.GroupStyle>
					<GroupStyle HidesIfEmpty="True">
						<GroupStyle.HeaderTemplate>
							<DataTemplate>
								<Grid Background="{StaticResource PhoneAccentBrush}" Margin="0,0,10,10"
								  HorizontalAlignment="Stretch" Height="50" Width="50">
									<TextBlock Text="{Binding Key}" Margin="10" FontSize="24"
										   HorizontalAlignment="Center" VerticalAlignment="Center" />
								</Grid>
							</DataTemplate>
						</GroupStyle.HeaderTemplate>
					</GroupStyle>
				</ListView.GroupStyle>
			</ListView>
		</SemanticZoom.ZoomedInView>
		<SemanticZoom.ZoomedOutView>
			<ListView 
			Background="#55234567" 
			ItemsSource="{Binding Source={StaticResource CollectionSource}, Path=CollectionGroups}" 
			HorizontalContentAlignment="Stretch" >
				<ListView.ItemTemplate>
					<DataTemplate>
						<Grid Background="{StaticResource PhoneAccentBrush}" Margin="10" 
						  HorizontalAlignment="Stretch"
						  Width="50" Height="50">
							<TextBlock Text="{Binding Group.Key}" Margin="10" FontSize="24"
										   HorizontalAlignment="Center" VerticalAlignment="Center" />
						</Grid>
					</DataTemplate>
				</ListView.ItemTemplate>
			</ListView>
		</SemanticZoom.ZoomedOutView>
		
	</SemanticZoom>
</Grid>
 
Zou je dan in de app die ik je heb gestuurd bij de eerste listview dat kunnen toevoegen, dan kan ik kijken hoe het daar werkt?

Kun je ook nog ff kijken , naar die listview van het filtreren, want daar wordt elk spel 2x weergegeven
 
Laatst bewerkt:
Inloggen met welke app? Dit heeft toch niets te doen met de app die je stuurde?
In het topic staan inmiddels een aantal verschillende. Waarschijnlijk handig als je per vraag (als het anders is/over een andere app gaat) een topic start om alles uit elkaar te houden :P

Ik kijk even of ik vanavond de listview kan aanpassen.
 
Dat had nog te maken met een vorige vraag over data halen van een site waarvoor je je moet inloggen. Dat heeft inderdaad niks met de app te maken die ik je gestuurd had.
 
Omdat je je code kent zul je hier wel genoeg aan hebben, kleine aanpassing.

[CPP]var lijst = await downloader.DownloadAlleSpellenAsync();
//Spellen.ItemsSource = lijst;
var alphaKeyGroups = AlphaKeyGroup<AlleSpellen>.CreateGroups(lijst, l => l.Spel, true);
CollectionViewSource.Source = alphaKeyGroups;[/CPP]


Code:
<CollectionViewSource x:Name="CollectionViewSource" x:Key="CollectionSource" IsSourceGrouped="True" ItemsPath="InternalList" />


<SemanticZoom>
	<SemanticZoom.ZoomedInView>
		<ListView x:Name="Spellen" ItemsSource="{Binding Source={StaticResource CollectionSource}}" >
			<ListView.ItemTemplate>
				<DataTemplate>
					<Grid Margin="6,12" Background="#FF4D4D4D" Height="auto" Tapped="Spel_Click" x:Name="SpelGrid">
						<Grid.RowDefinitions>
							<RowDefinition Height="auto"/>
							<RowDefinition Height="auto"/>
							<RowDefinition Height="auto"/>
						</Grid.RowDefinitions>
						<TextBlock Text="{Binding Spel}" Padding="12" FontSize="20" x:Name="SpelNaam"/>
						<Rectangle Height="3" Grid.Row="1" Fill="#FFEEDB1E" Margin="12,0"/>
						<StackPanel Grid.Row="2" Orientation="Horizontal">
							<TextBlock Text="{Binding Soort}" Margin="12,4" FontSize="16"/>
							<TextBlock Text="{Binding Moeilijkheid}" Margin="12,4" Width="750" FontSize="16"/>
						</StackPanel>
					</Grid>
				</DataTemplate>
			</ListView.ItemTemplate>
			<ListView.GroupStyle>
				<GroupStyle HidesIfEmpty="True">
					<GroupStyle.HeaderTemplate>
						<DataTemplate>
							<Grid Background="#FFEEDB1E" Margin="0,0,10,10"
								  HorizontalAlignment="Stretch" Height="50" Width="50">
								<TextBlock Text="{Binding Key}" Margin="10" FontSize="24"
										   HorizontalAlignment="Center" VerticalAlignment="Center" />
							</Grid>
						</DataTemplate>
					</GroupStyle.HeaderTemplate>
				</GroupStyle>
			</ListView.GroupStyle>
		</ListView>
	</SemanticZoom.ZoomedInView>
	<SemanticZoom.ZoomedOutView>
		<GridView Background="#55234567" ItemsSource="{Binding Source={StaticResource CollectionSource}, Path=CollectionGroups}" HorizontalContentAlignment="Stretch">
			<GridView.ItemTemplate>
				<DataTemplate>
					<Grid Background="#FFEEDB1E" Margin="10" Height="50" Width="50"
						  HorizontalAlignment="Stretch">
						<TextBlock Text="{Binding Group.Key}" Margin="10" FontSize="24"
							   HorizontalAlignment="Center" VerticalAlignment="Center" />
					</Grid>
				</DataTemplate>
			</GridView.ItemTemplate>
		</GridView>
	</SemanticZoom.ZoomedOutView>
</SemanticZoom>
 
Dankjewel, ik had wel zoiets geprobeerd, maar niks met die collectionviewsource

Hoe komt het trouwens dat bij het filtreren elk spel 2x weergeeft?
 
Laatst bewerkt:
Oh ja, ik had de ophaal methed gedebugged en daar staan ze al dubbel in de lijst dus je haalt ze dubbel van de website (mogelijk dat het dubbele nodes ophaalt). Verder niet naar de website gekeken.
 
Waarschijnlijk omdat je bijvoorbeeld door op de afbeelding en op de spelnaam te klikken naar het spel gaat op de site, dus twee mogelijkheden. Je moet even kijken voor je het spel aan de lijst toevoegt of het er al instaat of je moet de juiste nodes ophalen (mogelijk sommige overslaan ofzo).
 
Problem solved! :)
In de div zatten 2 divs dus als ik foreach div in div deed dan haalde ie 2x dezelfde <p> op, daarom werd het 2x weergegeven


Volgend vraagje:

Hoe kan ik een spel naar een lijst opslaan en dan om de mainpage bij favorieten de lijst weer ophalen?

Dat gaat denk ik het makkelijkste met IsolatedStorage, maar dat is veranderd in wp 8.1. Ik heb al gekeken in het bestand met de veranderingen , maar daar staat niet heel duidelijk hoe dat precies moet
 
Laatst bewerkt:
Ja ik had het gezien, het was toevallig dat het er hetzelfde uitzag met het ophalen van een text en een url.

Je kunt met data spelen met de Windows.Storage namespace

je kunt de lokale map vinden met:

Code:
var localFolder = ApplicationData.Current.LocalFolder;

en dan kun je vanalles doen zoals een map of bestand maken:

Code:
var imageFolder = await localFolder.CreateFolderAsync("images");
var favoritesFile = await localFolder.CreateFileAsync("favorites.xml");

Speel er maar eens mee

Om je favoriten op te slaan zou je kunnen kiezen voor bijvoorbeel een .xml of .json file of gewoon een .txt file. Wat je wilt.

Je kunt bijvoorbeeld een lijst met classes 'serializen' (omzetten naar een string) en deze wegschrijven naar een bestand. Als je hem wilt openen lees je de inhoud en 'deserialize' je hem weer naar de lijst met de class.



(voor json gaat mij voorkeur uit naar nuget package json.NET) al heeft windows nu ook basis json in de core zitten.

Als je wilt weten hoe xml of json eruit ziet in een bestand kun je simpel googlen en afbeeldingen bekijken.
 
[CPP]

private const string XMLFILENAME = "favorieten.xml";


private async void Favorite_Click(object sender, RoutedEventArgs e)
{
favoriet.IsChecked = true;
await writeXMLAsync();

}

private List<Favorieten> buildObjectGraph()
{
var favorieten = new List<Favorieten>();

favorieten.Add(new Favorieten(spelnaam.Text, "http://www.biernet.nl" + parameter + ""));

Debug.WriteLine("{0}", favorieten);

return favorieten;


}

private async Task writeXMLAsync()
{
var favorites = buildObjectGraph();

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

Debug.WriteLine("Favoriet is naar de appstorage geschreven");
}
[/CPP]


BuildObjectGraph werkt nog maar daarna crasht ie, waarom?


Alweer opgelost :)
Het lag aan de favorieten class, ik moest [DataContract] toevoegen
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan