Entwickler-Ecke
Sonstiges (.NET) - HTML Menüleiste per LV generieren
Csharp-programmierer - Do 07.04.16 15:45
Titel: HTML Menüleiste per LV generieren
Hallo ihr Experten.
Meine Idee: der Benutzer hat ein Formular mit einer ListView. In der ListView sind Daten für Title, Name usw. Per Mausklick, soll für jedes Item der ListView ein Event gefeuert werden. Bis dahin funktioniert alles. Eine Menüleiste in HTML ist ja so aufgebaut (als Tabelle) alls Zellen außer die aktuelle sind als Link definiert.
HTML-Dokument
1: 2: 3: 4: 5:
| <table> <td><a href="Datei 1.html">Datei 1</a></td> <td>Datei 2</td> <td><a href="Datei 3.html">Datei 3</a></td> </table> |
Das ist das Problem. Das Event akzeptiert einen Text Parameter. Aber für jedes Scintilla muss ja der einzelne Text dann anders sein. Also je nach dem, ob man in Datei 1 ist, müssen alle anderen Zellen als Link dargestellt werden.
Wie geht das?
Christian S. - Do 07.04.16 15:56
Was hat jetzt die Listview mit der HTML-Tabelle und mit Scintilla zu tun?
Csharp-programmierer - Do 07.04.16 16:08
Also in die ListView kommen alle Namen der Dateien, die das Programm erstellen soll.
Beispiel ein Projekt über Computer. Dann füge ich in die ListView ein:
-Programmierung
-Prozessor
-Grfikkarte
...
Dann soll in dem Fall 3* das Event ausgeführt werden, durch welches Scintillas erstellt werden. In diese Scintillas soll dann jeweils der HTML Code für die Menüleiste.
Also in das Scintilla1:
HTML-Dokument
1: 2: 3: 4: 5:
| <table> <td>Programmierung</td> <td><a href="Prozessor.html">Prozessor</a></td> <td><a href="Grafikkarte.html">Grafikkarte</a></td> </table> |
In das Scintilla2:
HTML-Dokument
1: 2: 3: 4: 5:
| <table> <td><a href="Programmierung.html">Programmierung</a></td> <td>Prozessor</td> <td><a href="Grafikkarte.html">Grafikkarte</a></td> </table> |
In das Scintilla3:
HTML-Dokument
1: 2: 3: 4: 5:
| <table> <td><a href="Programmierung.html">Programmierung</a></td> <td><a href="Prozessor.html">Prozessor</a></td> <td>Grafikkarte</td> </table> |
Also das soll der PC auto. machen
Moderiert von
Christian S.: HTML-Tags hinzugefügt
Christian S. - Do 07.04.16 16:54
Wieso Event? :gruebel:
Also ich stelle mir das irgendwie so vor:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private static string BuildMenu(string activeEntry, string[] allEntries) { var sb = new StringBuilder(); sb.AppendLine("<table><tr>");
var noClickFormat = "<td>{0}</td>"; var clickFormat = "<td><a href=\"{0}.html\">{0}</a></td>";
foreach (var entry in allEntries) { sb.AppendFormat(activeEntry == entry ? noClickFormat : clickFormat, entry); }
sb.AppendLine("</tr></table>"); return sb.ToString(); } |
Das rufst Du dann für jeden Eintrag in der Listview einnmal auf, wobei
allEntries alle Einträge der Listview sind und
activeEntry der, für den Du das gerade aufrufst.
Generell kann ich aber nur sehr dazu raten, eine Template-Engine zu benutzen, wenn Du größere Mengen HTML-Code erzeugen möchtest.
Csharp-programmierer - Do 07.04.16 17:03
Die Form1 beinhaltet eine TabControl. Über das Event werden die einzelnen Scintillas erzeugt (HTML, CSS) und gleich mit Text gefüllt. Dafür das Event, welches ich auf der Form2 über eine delegate void verknüpft habe.
Und wie ruft ich Ihre Methode auf?
Ralf Jansen - Do 07.04.16 17:18
Auch wenn ich etwas Context aus deinem letzten Fragen haben bei der hier kann ich nur folgendes aus deiner Beschreibung zusammenfassen:
häh?
Versuche mal deine Beschreibung auf das Wesentliche einzudampfen und zwar am besten so das am Ende eine konkrete Frage steht. Die man beantworten kann ohne jedes Detail deiner bisherigen Fragen zu kennen. Sonst hast du so gut wir gar keine Chance Hilfe zu bekommen die auch tatsächlich hilft und dich nicht einfach noch zusätzlich verwirrt.
Csharp-programmierer - Sa 09.04.16 23:19
Ich habe das Problem nun allein gelößt :flehan: :beer: :zustimm:
Es funktioniert jetzt genau so, wie ich es möchte :)
Hier der Code (die Testversion)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| private void button3_Click(object sender, EventArgs e) { _x = 0; foreach (ListViewItem i in this.listView1.Items) { _Scintilla(GeneruereHTML()); _x++; } }
private void _Scintilla(string TExt) { TabPage t = new TabPage(); ScintillaNET.Scintilla scintilla = new ScintillaNET.Scintilla(); scintilla.Dock = DockStyle.Fill; scintilla.Text = TExt; t.Controls.Add(scintilla); this.tabControl1.TabPages.Add(t); }
public string GeneruereHTML() { StringBuilder html = new StringBuilder(); html.AppendLine("<!DOCTYPE html>"); html.AppendLine(" " + "<head>");
html.AppendLine("\t <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"); html.AppendLine("\t a { text-decoration:underline; }"); html.AppendLine("\t a { text-decoration:none; }");
html.AppendLine(" " + "<body>\r"); html.AppendLine("\t<table>"); foreach (ListViewItem item in this.listView1.Items) { if (item.Index == _x) html.AppendLine("\t\t<td bgcolor=\"Gray\">" + item.SubItems[1].Text + "</td>"); else html.AppendLine("\t\t<td bgcolor=\"Gray\"><a href=\"" + item.Text + "\"</a></td>"); }
html.AppendLine("\t</table>");
html.AppendLine(" " + "</body>"); html.AppendLine("</html>");
return html.ToString(); } |
Was haltet ihr vin dem Lösungsansatz? Kann ich daran was besser machen?
Christian S. - So 10.04.16 00:24
Csharp-programmierer hat folgendes geschrieben : |
Ich habe das Problem nun allein gelößt :flehan: :beer: :zustimm: |
Naja, es ist irgendwie genau das Vorgehen, was ich beschrieben hatte :nixweiss:
Zuerst einmal zum Stil:
In C# werden generell keine Unterstriche in Namen von Bezeichnern verwendet. Tippfehler ("TExt", "GeneruereHTML") darf man auch im Quelltext beheben. ;-)
_x scheint ein Feld der Klasse zu sein. Das halte ich für unsauber, weil es somit auch von anderer Methoden zugreifbar ist. Es reicht, wenn Du
GeneriereHTML einen entsprechenden Parameter gibst, dann brauchst Du das Feld nicht. Ich würde außerdem empfehlen, einen sprechenderen Namen (z.B. "currentItem") zu benutzen.
Noch ein Wort zu Deinem HTML-Quelltext:
Der "head"-Tag wird nie geschlossen. Der CSS-Teil ist nicht mit entsprechenden Tags umschlossen. Du erzeugst in der Tabelle keine Zeilen ("tr").
Generell nochmal der Rat: Schau Dich mal nach einer Template-Engine um, damit Du den HTML-Quelltext nicht im C#-Quelltext stehen hast, sondern Design und Logik trennen kannst. Meist kann man ein Template dann auch viel besser bearbeiten, weil es eine HTML-Datei ist, mit der man in einem entsprechenden Editor bequem arbeiten kann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!