Laden...

ListView Auswahl in anderer ListView anzeigen

Erstellt von mysharp55 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.134 Views
M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren
ListView Auswahl in anderer ListView anzeigen

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 😉 !

M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren

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){...}
189 Beiträge seit 2014
vor 9 Jahren

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

M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren

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

M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren

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?

1.696 Beiträge seit 2006
vor 9 Jahren
  1. htmlstr wird bei jedem Durchlauf erneut überschrieben, wenn der letzte Wert null ist, dann sollst du dich nicht wundern
  2. dito mit htmlstrNeu und da htmlstrNeu lokal ist, wird sie nach Verlassen des Handlers nicht existent!

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?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren

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

M
mysharp55 Themenstarter:in
17 Beiträge seit 2015
vor 9 Jahren

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...

189 Beiträge seit 2014
vor 9 Jahren

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!