Guten Morgen,
Ich habe eine GUI mit 2x ListView mit WinForms erstellt.
Wenn ich in der 1. ListView eines der Elemente auwähle und auf dieses einen Doppelklick mache funktioniert es:
private void ausgabeListView_MouseDoubleClick(object sender, MouseEventArgs e)
{
BrowserStarten browser = new BrowserStarten();
ListViewHitTestInfo info = ausgabeListView.HitTest(e.X, e.Y);
ListViewItem item = info.Item;
if (item != null)
{
browser.WebseiteOeffnen(item.Text);
}
else
{
this.ausgabeListView.SelectedItems.Clear();
MessageBox.Show("Es wurde keine Url ausgewählt.");
}
}
Nun möchte ich, das wenn ich 1. ListView das Element mit nur einem Klick markiere im 2. ListView eine Info angezeigt wird.
Folgendes habe ich versucht, aber es fuktioniert NUR beim ersten Element, wie kann ich ermitteln welches gerade aktiv ausgewählt wurde? Oder wo liegt der Fehler?
private void ausgabeListView_Click(object sender, EventArgs e)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
WebMetaData webMetaData = new WebMetaData();
List<string> metaTagListe = webMetaData.MetaTagAuslesen(htmlstr);
foreach (string elem in metaTagListe)
{
metaTagsListView.Items.Add(elem);
}
}
Danke schon jetzt für eure Mühe - bald ist Wochenende 😉 !
Also ich dachte an etwas wie:
htmlstr = ausgabeListView.GET-AUSGEWÄHLTES-ELEMENT()
Und GET-AUSGEWÄHLTES-ELEMENT liefert eine string zurück 😉
Mit "ListView.SelectedIndexChanging" habe ich es nicht hinbekommen...
Diese Zeile würde ich dann hier ergänzen:
private void ausgabeListView_Click(object sender, EventArgs e){...}
Hallo mysharp55,
sowas ähnliches gibts ja auch: die Property "SelectedItems" einer ListView.
https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=de-de&k=k%28System.Windows.Forms.ListView.SelectedItems%29;k%28TargetFrameworkMoniker-.NETFramework
Hilft das weiter?
Ezio
Hi Danke,
wenn ich jetzt folgendes anpasse:
private void ausgabeListView_Click(object sender, EventArgs e)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
ListView.SelectedListViewItemCollection breakfast =
this.ausgabeListView.SelectedItems;
WebMetaData webMetaData = new WebMetaData();
foreach (ListViewItem item in breakfast)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
htmlstr = item.Text;
List<string> metaTagListe = webMetaData.MetaTagAuslesen(htmlstr);
//Einzelne Elemente (hier die metaTags) in der ListView ausgeben
foreach (string elem in metaTagListe)
{
metaTagsListView.Items.Add(elem);
}
}
// Output the price to TextBox1.
textBox1.Text = "Test";
}
Dann bleibt meine "ausgabeListView" in der GUI leer, es wird nur die textBox1 (die ich jetzt zum Testen erstellt habe) mit Ihnalt gefüllt ("Test").
Das hier
htmlstr = item.Text;
schient wohl nich zu funktionieren > meine Methode bekommt keine Url (also die aktuell ausgewählte Zeile im ListView) geliefert...
Sorry falls ich mich blöd anstelle... aber es ist als Anfänger nicht immer ganz einfach
Geh mal mitm Debugger ran und schau dir an, was im "item" drinne steckt.
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
http://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_07_003.html#dodtpc45667f3-2b6e-4749-a023-38c2d740cb99
Debugger = Super Tipp > Danke dafür - hätte ich auch selbst drauf kommen können.
Also jetzt hat "item" das richtige Element:
private void ausgabeListView_Click(object sender, EventArgs e)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
ListView.SelectedListViewItemCollection breakfast =
this.ausgabeListView.SelectedItems;
WebMetaData webMetaData = new WebMetaData();
foreach (ListViewItem item in breakfast)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
htmlstr = item.Text;
List<string> metaTagListe = webMetaData.MetaTagAuslesen(htmlstr);
//Einzelne Elemente (hier die metaTags) in der ListView ausgeben
foreach (string elem in metaTagListe)
{
metaTagsListView.Items.Add(elem);
}
}
}
Aber "htmlstr" hat immer noch den alten Inhalt. Also wird die Methode.
webMetaData.MetaTagAuslesen(htmlstr);
nicht mit dem aktuellen Inhalt gefüllt.
Wenn ich es jetzt wie folgt ändere:
private void ausgabeListView_Click(object sender, EventArgs e)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
ListView.SelectedListViewItemCollection breakfast =
this.ausgabeListView.SelectedItems;
WebMetaData webMetaData = new WebMetaData();
foreach (ListViewItem item in breakfast)
{
//Inhalt des ListView vor jedem Start der Ausgabe leeren
//metaTagsListView.Clear();
//htmlstr = item.Text;
string htmlstrNeu = item.Text;
List<string> metaTagListe = webMetaData.MetaTagAuslesen(htmlstrNeu);
//Einzelne Elemente (hier die metaTags) in der ListView ausgeben
foreach (string elem in metaTagListe)
{
metaTagsListView.Items.Add(elem);
}
}
}
Passirt nichts - Debugger meldet:
htmlstrNeu = null;
Hmm was fehlt denn da noch?
Wie und wann prüfst du den Wert von diese Variablen? Hast du während des Debuggens nachgeprüft, ob item.Text Werte enthält?
**:::
Hmm wenn ich das hier ergänze:
htmlstr = item.Text;
MessageBox.Show(htmlstr);
List<string> metaTagListe = webMetaData.MetaTagAuslesen(htmlstr);
Gibt mir die MessageBox das richtige Element aus.
Aber "crawler = null" laut Debugger. Jetzt liegt der Fehler wohl in der aufgerufenen Klasse - oder?
Hier die andere Klasse:
class WebMetaData
{
Crawler crawler;
public List<string> MetaTagAuslesen(string htmlStr)
{
string metaTitle;
List<string> metaTagList = new List<string>();
crawler = new Crawler();
Regex regexLinkTitle = new Regex("<title>([^<]*)</title>");
foreach (var matchTitle in regexLinkTitle.Matches(htmlStr))
{
if (!metaTagList.Contains(matchTitle.ToString()))
{
metaTitle = crawler.GetLinkedUrl(matchTitle.ToString());
metaTagList.Add(metaTitle);
}
}
return metaTagList;
}
}
}
Danke
Es funktioniert jetzt
Vielen Dank für eure Geduld! - Der Debugger ist jetzt mein enuer Freund 😉 !
Gibt es eigentlich eine Möglichkeit, einen Zeilenumbruch für ein ListView Item einzufügen?
Ich habe die ListVire mail von "List" auf "Tile" gestellt, damit man den Inhalt komplett angezeigt bekommt, wenn man mit der Maus über einem Eintrag ist.
Mit "List" werden manche Einträge einfach abgeschnitten, bzw "laufen" aus er ListView (dem Rand) raus...
Entweder du passt die Liste an: http://stackoverflow.com/questions/1257500/c-sharp-listview-column-width-auto
Oder du überlegst dir und programmierst eine Regel, für die du "\n" in den string einfügst.
Schön, dass du selbst erfahren und begreifen konntest, wie wichtig der Debugger ist. 😃
Da bist du schonmal auf nem guten Weg!