Autor |
Beitrag |
Chiyoko
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 09:00
Folgender Verlauf:
Kurz gesagt
-ich möchte Text in Rtb-Textboxen aus XML auslesen lassen.
-die ID aus der XML wird ins Listview geladen
-dabei wird die ID aus dem Listview gelesen und mit dem jeweils angeklicktem Item abgeglichen
-stimmt die ID überein, wird der Text in die RTb-Textbox eingetragen, das Bild geladen
Nur, bis ich ein neues Item anklicken kann, muss das Bild geladen sein, somit dauert das umschalten teilweise sehr lange.
Ich hab es nun öfter optimiert und denke, das maximum ist erreicht.
Die Frage ist nun, wie kann ich das voneinander trennen?Wird wohl nur ein Logikproblem sein.
Das Bild muss trotzdem mit dem Text geladen werden, aber der Ladeprozess sollte abzubrechen sein.
Bin für jeden Ratschlag dankbar.
Ein par Code Fragmente zur Übersicht:
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:
| public class FolderDataRead { public FolderDataRead() { }
DirectoryInfo dir7 = new DirectoryInfo(Path.Combine(Application.StartupPath, (@"FFBilder\FF7Bilder")));
List<string> Bildnamenff7 = new List<string>();
public string getPathff7 { get { return dir7.FullName; } } public List<string> getPictureDataOhneExtensionFF7 { get { if (dir7.Exists) { FileInfo[] filesWithoutExtff7 = dir7.GetFiles("*.gif", SearchOption.AllDirectories); foreach (FileInfo fileff7 in filesWithoutExtff7) { if (fileff7.Exists) { string fileExtRemovedff7 = fileff7.Name.Replace(fileff7.Extension, ""); Bildnamenff7.Add(fileExtRemovedff7); } else { MessageBox.Show("Daten nicht gefunden"); } } } else MessageBox.Show("Ordner existiert nicht");
return Bildnamenff7; } } } |
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: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| panffCharsSplitcontainer.Show(); FFaktiv = 7;
if (lvChars != null) { lvChars.Items.Clear(); ctlCharClear(); foreach (var ff7char in FF7Char) { ff7wrapper.FinalFantasyClass_root = ff7char; string ff7CharID = ff7wrapper.FF7_charID; lvChars.Items.Add(ff7CharID); } }
private void lvChars_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { var FF7Char = doc7.XPathSelectElements("//Char");
FolderDataRead folderReader = new FolderDataRead(); if (lvChars != null) { if (FFaktiv == 7) { foreach (var ff7char in FF7Char) { ff7wrapper.FinalFantasyClass_root = ff7char; string ff7CharData = ff7wrapper.FF7_chardata; string ff7CharData1 = ff7wrapper.FF7_chardata1; string ff7CharAllg = ff7wrapper.FF7_charallgemein; string ff7CharID = ff7wrapper.FF7_charID;
if (e.IsSelected) { string eItemText = e.Item.Text; if (eItemText == ff7CharID) { ctlCharClear(); rtbCharsDetails.Text = ff7CharData; rtbCharsDetails1.Text = ff7CharData1; rtbCharsAllg.Text = ff7CharAllg;
foreach (string Bildnameff7 in folderReader.getPictureDataOhneExtensionFF7) { if (e.Item.Text == Bildnameff7) picBoxChars.ImageLocation = folderReader.getPathff7 + @"\Chars\" + Bildnameff7 + ".gif"; else picBoxChars.Image = global::FinalFantasyBibliothek.Properties.Resources.KeinBild; } } } } } } } |
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Do 07.07.11 09:11
Lade die Bilder in einem Thread. Dann werden Sie im Hintergrund geladen ohne deine GUI zu belasten und du kannst abbrechen wie gewünscht.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 09:14
Genau die Antwort hab ich erwartet,...darauf wollte ich verzichten, aber danke.
Falls sich keine andere Lösung findet,...greif ich darauf zurueck.
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Do 07.07.11 10:13
Welchen Grund gibt es, darauf zu verzichten???
Eine andere Lösung gibt es nicht. Zumindest keine, die nicht einen Mega-Aufwand bedeutet um im Prinzip eine eigene Thread-Lösung darstellen würde. Solange dein Hauptthread mit dem Laden des Bildes beschäftigt ist, kann er keine anderen Aufgaben übernehmen, wie zum Beispiel das Abbrechen eines Vorgangs. Genau aus diesem Grund gibt es Threads, damit man (quasi-) parallel Aufgaben erledigen kann.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 10:35
Nun,...wenn man sich damit nie auseinandergesetzt hatte:p
Meine ersten versuche schlugen fehl.Ich versuchs weiter.
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Do 07.07.11 12:02
Naja, dafür gibt es ja das Forum. Wenn du nicht weiter weißt, fragst du. Dann wird dir auch geholfen.
z.B. Laden eines Bildes:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Image Source { get; set;}
public void LoadPictureAsync() { ((Action<string>)LoadPicture).BeginInvoke("test.jpg",new AsyncCallback(LoadPictureComplete)); }
public void LoadPictureComplete(IAsyncResult result) { this.pictureBox1.Image = Source; }
public void LoadPicture(string path) { Source = Image.Load(path); } |
Das ist mal ein Beispiel- ist aber ungetestet. Die LoadPictureAsync brauchst du nicht. Du schreibst einfach an der Stelle wo du dein Bild laden möchtest, den Inhalt dieser Funktion. Es geht auch noch kürzer:
C#-Quelltext 1: 2:
| Image Source = null; ((Action)(()=>{Source = Image.Load("test.jpg");})).BeginnInvoke((result)=>{this.pictureBox1.Image = Source;}, new object()); |
da einfügen, wo du das Bild laden willst.
Zuletzt bearbeitet von norman2306 am Do 07.07.11 12:07, insgesamt 2-mal bearbeitet
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 12:04
Ich suche mir erstmal andere Möglichkeiten, das ist mir zu komplex.
Es heisst immer, dass ich auf Listview zugreife, wie aber sonst soll ich denn einen abgleich mit dem ID Namen machen?
(Innerhalb des Events brauch ich ja die foreach schleife für die ganzen Bilder).
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Do 07.07.11 12:10
Am einfachsten ist, du machst ein 'boxing' des Namens. Mit Steuerelementen ist es so eine Sache. Auf die darf man nicht zugreifen von einem anderem Thread aus. Schick doch mal den Code, wo der Zugriff passiert und den Auschnitt, von dem aus du startest.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 12:28
Hab ich oben angegeben, aber ich beschreibs gerne nochmal:
Erstmal die Klasse, wo die Bilder ausgelesen werden sollen,
als Rückgabe wert dient ein Array, was den Namen ohne Extension ausgibt.
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:
| public class FolderDataRead { public FolderDataRead() { }
DirectoryInfo dir7 = new DirectoryInfo(Path.Combine(Application.StartupPath, (@"FFBilder\FF7Bilder")));
List<string> Bildnamenff7 = new List<string>();
public string getPathff7 { get { return dir7.FullName; } } public List<string> getPictureDataOhneExtensionFF7 { get { if (dir7.Exists) { FileInfo[] filesWithoutExtff7 = dir7.GetFiles("*.gif", SearchOption.AllDirectories); foreach (FileInfo fileff7 in filesWithoutExtff7) { if (fileff7.Exists) { string fileExtRemovedff7 = fileff7.Name.Replace(fileff7.Extension, ""); Bildnamenff7.Add(fileExtRemovedff7); } else { MessageBox.Show("Daten nicht gefunden"); } } } else MessageBox.Show("Ordner existiert nicht");
return Bildnamenff7; } } } |
Jetzt möchte ich auf die Listview items zugreifen und je nach Name soll das Bild geladen werden.
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: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| if (lvChars != null) { lvChars.Items.Clear(); ctlCharClear(); foreach (var ff7char in FF7Char) { ff7wrapper.FinalFantasyClass_root = ff7char; string ff7CharID = ff7wrapper.FF7_charID; lvChars.Items.Add(ff7CharID); } }
private void lvChars_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
var FF7Char = doc7.XPathSelectElements("//Char");
FolderDataRead folderReader = new FolderDataRead(); if (lvChars != null) { if (FFaktiv == 7) { foreach (var ff7char in FF7Char) { ff7wrapper.FinalFantasyClass_root = ff7char; string ff7CharData = ff7wrapper.FF7_chardata; string ff7CharData1 = ff7wrapper.FF7_chardata1; string ff7CharAllg = ff7wrapper.FF7_charallgemein; string ff7CharID = ff7wrapper.FF7_charID;
if (e.IsSelected) { string eItemText = e.Item.Text; if (eItemText == ff7CharID) { ctlCharClear(); rtbCharsDetails.Text = ff7CharData; rtbCharsDetails1.Text = ff7CharData1; rtbCharsAllg.Text = ff7CharAllg;
foreach (string Bildnameff7 in folderReader.getPictureDataOhneExtensionFF7) { if (e.Item.Text == Bildnameff7) picBoxChars.ImageLocation = folderReader.getPathff7 + @"\Chars\" + Bildnameff7 + ".gif"; else picBoxChars.Image = global::FinalFantasyBibliothek.Properties.Resources.KeinBild; } } } } } } } |
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Do 07.07.11 13:40
Und wo kommt da der Fehler?
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Do 07.07.11 13:48
Da kommt kein Fehler, das Bild läd nur zu langsam.
Wenn du den Backroundworker meinst:
Ich soll ich ja alles mit Steuerelementen in Ruhe lassen, da frag ich mich,
was ich ueber den Worker machen soll?
Ich brauch den ID Abgleich und das zaehlt wieder unter Steuerelement.
Das selbe mit einer Progressbar.So ganz blick ich nicht durch.
Ich hab mich mal an einem simplen Beispiel versucht, aber mir sind die Werte doch gar nicht bekannt, soll man sich da welche ausdenken?Ich sehe öfter, dass eine for schleife hochgezählt wird, ...dadurch erfahr ich aber nicht, wie
viele Items z.b. in eine Listview geladen werden, oder seh ich das falsch?
Normale Dinge wie Zahlen, die ich einfach hochzähle, funktionieren ja.Aber keine Werte, die ich
vorher nicht weis(wie oben das bsp mit der Listview oder dem Bild)
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Fr 08.07.11 12:06
Ich habs geahnt,......vor kurzem nahm ich an, das Bilder nachgeladen werden, die
UI ist total irreleveant.
Naja Code sagt mehr als tausend Worte, ich spar mir auf jedenfall threading:
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:
| if (lvChars != null) { if (FFaktiv == 8) { foreach (var ff8char in FF8Char) { ff7wrapper.FinalFantasyClass_root = ff8char; string ff8CharData = ff7wrapper.FF8_chardata; string ff8CharData1 = ff7wrapper.FF8_chardata1; string ff8CharAllg = ff7wrapper.FF8_charallgemein; string ff8CharID = ff7wrapper.FF8_charID;
if (e.Item.Selected) { TextAuslesenSplitcon2Pan2(); int indexer = e.ItemIndex;
if (e.Item.Text == ff8CharID) { ctlCharClear(); rtbCharsDetails.Text = ff8CharData; rtbCharsDetails1.Text = ff8CharData1; rtbCharsAllg.Text = ff8CharAllg;
foreach (string Bildnameff8 in folderReader.getPictureDataOhneExtensionFF8) { if (e.Item.Text == Bildnameff8) { picBoxChars.ImageLocation = folderReader.getPathff8 + @"\Chars\" + Bildnameff8 + ".gif"; if (e.ItemIndex != indexer) { if (e.Item.Text == Bildnameff8) { picBoxChars.ImageLocation = folderReader.getPathff8 + @"\Chars\" + Bildnameff8 + ".gif"; } } } } } } } } |
|
|