Autor Beitrag
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 19.06.11 00:39 
Wozu den Eventhandler im Changing hinzufügen :gruebel: ? EndUpdate ist wohl idempotent, deswegen knallt es hier nicht, aber du häufst dadurch trotzdem einen Rattenschwanz an Delegates an.

_________________
>λ=
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
proteced override onResize(EventArgs e)
{
   base...
}

// Es geht auch ueber:
this.Redrawresize
// das zählt aber für alle Controls und ich möchte es spezifisch nur für das Event
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 19.06.11 10:36 
user profile iconChiyoko hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mo 20.06.11 19:33 
Hast du denn eine bessere idee?

Ich hab den thread wieder aufgemacht, so kanns nicht bleiben.
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: 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).

ausblenden 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 aus und gleich wieder anstellen..
            timer.Enabled = true;//so verhinderst du den handleraufruf wärend der größenänderung..
        }
        private void timer_Tick(object sender, EventArgs e)
        {
            listview.EndUpdate();
            timer.Enabled = false;
        }


k.p. ob das aber hier funktioniert. glück auf!
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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?:D
Zumal das jetzt als einziges funktioniert.
Ich kann ja auch die Events wieder deligieren oder?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.


ausblenden 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;
        }


user profile iconChiyoko hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.06.11 18:31 
Hallo Chiyoko,

bei jedem Aufruf von
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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^^