Autor |
Beitrag |
Chiyoko
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Sa 18.06.11 11:50
Huhu,
Wie die Ueberschrift schon sagt, frag ich mich, wie über 2 Events(Changing/Changed) das zeichnen der Listview items unterbinden kann, sobald die Column width Eigenschaft geändert wird?
Bitte um Ratschläge,
Danke.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Sa 18.06.11 23:49
Seit Wochen habe ich über gewisse Eventungewohnheiten gerätselt, aber ich habs endlich kapiert, ...wahrscheinlich falsch gelesen.So funktionierts:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| private void listview_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) { listview.BeginUpdate(); listview.ColumnWidthChanged += new ColumnWidthChangedEventHandler(listview_ColumnWidthChanged); } private void listview_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs d) { listview.EndUpdate(); } |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 19.06.11 00:39
Wozu den Eventhandler im Changing hinzufügen  ? EndUpdate ist wohl idempotent, deswegen knallt es hier nicht, aber du häufst dadurch trotzdem einen Rattenschwanz an Delegates an.
_________________ >λ=
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: So 19.06.11 02:06
Weil ich das Event selbst nicht als Funktion in der Funktion aufrufen kann.
Oder hast du eine bessere Idee?
Ich will ja nicht, das es einfach nur funktioniert, es soll schon richtig sein.
Wenn s geht ohne:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| proteced override onResize(EventArgs e) { base... }
this.Redrawresize |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 19.06.11 10:36
Chiyoko hat folgendes geschrieben : | Weil ich das Event selbst nicht als Funktion in der Funktion aufrufen kann. | listview_ColumnWidthChanged rufst du doch jetzt auch nicht selbst auf? Wenn du die Zeile streichst und dafür das Event im Designer einhängst, wird dein Code genau das gleiche tun, nur etwas sinnvoller sein.
_________________ >λ=
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: So 19.06.11 11:50
Wenn dem so waere....wuerde ich nicht hier geschrieben haben:p...oder?
Wenn ich das Event nicht in dieser Methode aufrufe, sondern im Designer definiere, wird Endupdate nicht aufgerufen.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Mo 20.06.11 19:33
Hast du denn eine bessere idee?
Ich hab den thread wieder aufgemacht, so kanns nicht bleiben.
|
|
Dr. Hallo
      
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Di 21.06.11 00:12
ich weiß nicht recht ob ich dein problem richtig verstehe, aber hier totzdem ein vorschlag:
benutze einen timer und stell das timer.interval = 10 (od. auch 5 oder gar 1).
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| private void listview_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) { listview.BeginUpdate(); timer.Enabled = false; timer.Enabled = true; } private void timer_Tick(object sender, EventArgs e) { listview.EndUpdate(); timer.Enabled = false; } |
k.p. ob das aber hier funktioniert. glück auf!
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 21.06.11 09:05
Nein brachte leider nichts aber danke.
Nach wie vor gehts nur mit dem abonieren des Events in der Methode.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 21.06.11 12:46
www.mycsharp.de/wbb2...d.php?postid=3549074
In diesem Link wird auch ein Event in einer Methode abonniert, was ist denn nun korrekt?
Zumal das jetzt als einziges funktioniert.
Ich kann ja auch die Events wieder deligieren oder?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 21.06.11 13:28
Ich habe es mir mal angeschaut, da hast du wohl die Doku nicht genau genug gelesen:
Zitat: | If BeginUpdate is called more than once, EndUpdate must be called an equivalent number of times. |
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| bool columnWidthChanging = false;
void listView1_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e) { if (!columnWidthChanging) { columnWidthChanging = true; listView1.BeginUpdate(); } }
void listView1_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) { listView1.EndUpdate(); columnWidthChanging = false; } |
Chiyoko hat folgendes geschrieben : | In diesem Link wird auch ein Event in einer Methode abonniert |
Aber einmalig. Das macht der Designer auch nicht anders, wenn du dir die .designer.cs einmal anschaust.
_________________ >λ=
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 21.06.11 13:42
Was hat denn die Doku damit zu tun?
Danke, den Gedanken hatte ich schon seit anbeginn, wollte aber nix mit Variablen machen.
Dann verbleibe ich so..:=
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 21.06.11 14:38
Zitat: | Was hat denn die Doku damit zu tun? |
Das sie eindeutig sagt das man BeginUpdate und EndUpdate gleich oft aufrufen muss. Du rufst aber EndUpdate n*mal und BeginUpdate nur 1 mal beim resizen auf. Wobei n für die Anzahl bisheriger resize Vorgänge steht.
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 21.06.11 15:30
Versteh ich nicht.
Ich hab doch genau einmal das Event waehrend des Resize und einmal für das Beenden des Resize.
Wenn ich die Maustaste loslasse, hat es genau einmal stattgefunden.
Das hat ehr was mit meiner Logik zu tun als mit der Doku.
Wenn es ein BeginUpdate gibt, muss es auch ein EndUpdate geben.
Aber in dem Fall wusste ich nicht, wie oft denn nun BeginnUpdate aufgerufen wird.
EDIT: bzw Endupdate.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 21.06.11 18:31
Hallo Chiyoko,
bei jedem Aufruf von
C#-Quelltext 1:
| listview.ColumnWidthChanged += ... |
fügst du dem Event eine weitere Methode hinzu, d.h. beim ColumnWidthChanged-Ereignis wird dann auch mehrfach deine Methode aufgerufen (und damit auch mehrfach das EndUpdate).
Warum also registrierst du dieses Event dann nicht auch nur einmalig im Konstruktor (bzw. per Designer) - wie du es ja auch für das ColumnWidthChanging gemacht hast?
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 21.06.11 19:13
@Th69
Ja danke, ich infomier mich da nochmal im Netz.
Aber den Abschnitt hab ich nun verstanden^^
Der einfachste Weg ist doch manchmal der beste Weg;)
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 21.06.11 22:14
Da ich aus deinen Beiträgen nicht herauslesen kann, ob du nun meine oder weiterhin deine Version benutzt: Der von mir erwähnte "Rattenschwanz" an Delegates, die am Changed-Event hängen, ist vor allem ein Memory Leak, benutz also bitte meinen Code  .
_________________ >λ=
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Mi 22.06.11 08:17
Hab ich mich so missversändlich ausgedrückt?...ich finde eigendlich nicht.
Ich schrieb, dass mir deine Variante schon seit Anbeginn dieses Problems im Kopf bestand, ich es aber nicht nutzen wollte.
(Wusste aber auch nicht, ob es funktionieren würde hehe).
Auf jeden Fall nutze ich jetzt die boolische Variante, damit der Code sauber bleibt.
Das Problem mit den Delegates habe ich mir nochmal bestätigen lassen, als hier noch keine Antwort bestand.
Danke, ich weis fürs nächste mal bescheid^^
|
|