Laden...

Listview Flackert, egal was ich mache

Erstellt von Rolli vor 17 Jahren Letzter Beitrag vor 15 Jahren 12.426 Views
R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren
Listview Flackert, egal was ich mache

ich werd noch verrückt ! ! ! !

habe jetzt schon alles über doublebuffer hier im Forum durch und auch gegoogelt.
Ich hänge jetzt schon 3 Tage an dem sch.... geflacker.

ich habe eine Listview die den Downloadfortschritt (auch mehrere möglich) anzeigt.

es werden der fortschritt einer progressbar über GetEmbeddedControl angezeigt,
auch die bereits geladenen kb werden angezeigt. Es werden nur diese beiden items aktualisiert.

doch das geflacker nervt ohne ende. Doublebuffer zeigt entweder garkeine Wirkung
oder die Items, ausser der Progressbar werden garnicht angezeigt.

Hier ein paar codeabschnitte




//erbklasse des Listview um progressbar einzufügen
private ListViewEmbeddedControls.ListViewEx listViewDown;
........

public client
{
InitializeComponent();
				
// Activate double buffering
SetStyle( ControlStyles.AllPaintingInWmPaint
| ControlStyles.DoubleBuffer
| ControlStyles.ResizeRedraw, true );

//bezieht sich wahrscheinlich nur auf die Form und nicht auf Listview.
//hab jedoch schon zeile für zeile an allen stellen probiert, in Form garkeine wirkung
//in erbklasse entweder keine items ausser progressbar oder keine wirkung. ???

}


void listViewData_DoubleClick( .....)
{

     lvi = listViewDown.Items.Add("", img);
     lvi.SubItems.Add(downfile);
     lvi.SubItems.Add(KB);
     lvi.SubItems.Add("canceled");  //loaded
     lvi.SubItems.Add("");     //Progress
     lvi.SubItems.Add("Queue");       //Status
     lvi.SubItems.Add(Hashcode);
 
     ProgressBar pb = new ProgressBar();
     // Embed  ProgressBar in Column 4 (1) line (0)
     

     
      int row;
      row =  listViewDown.Items.Count-1;
	  listViewDown.AddEmbeddedControl(pb, 4, row);

..........

ThreadStart myTS = new ThreadStart(writer);
Thread myThread = new Thread(myTS);
 
myThread.Start();

}

public  void writer()
  {

    SetProgressBarValue( setter, row, sz);   
    SetKBSizeValue(setter, row);              
    w.Write(read, 0, bytes);                  //write file

}

//new kb-size
private void SetKBSizeValue(int kbs, int row)
{

int kb = Convert.ToInt32(listViewDown.Items[row].SubItems[2].Text);
//int kb = kbs;
int percent;

percent = kbs * 100 / kb;
listViewDown.Items[row].SubItems[3].Text = kbs.ToString() + " KB /  " + percent.ToString() + "%";

	listViewDown.Items[row].SubItems[5].Text =  "loading..";

}




// new progress size
private void SetProgressBarValue(int s, int row, int max)
{

ProgressBar pb = listViewDown.GetEmbeddedControl(4, row) as ProgressBar;
paneloptions.Visible = false;
pb.Minimum = 0;
pb.Maximum = max;

  pb.Step = 1;
  pb.PerformStep();

}



und hier die erbklasse für Listview



using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace ListViewEmbeddedControls
{

	public class ListViewEx : ListView
	{
		
    private System.ComponentModel.Container components = null;

    
    private const int WM_NOTIFY = 0x004E;      

    private const int NM_FIRST = (0 - 0);      
    private const int NM_CUSTOMDRAW = (NM_FIRST - 12);

    [StructLayout(LayoutKind.Sequential)]
    private struct NMHDR
    {
      public int hwndFrom;
      public int idFrom;  
      public int code;          
    }
	
		#region Interop-Defines
		[DllImport("user32.dll")]
		private	static extern IntPtr SendMessage(IntPtr hWnd, int msg,	IntPtr wPar, IntPtr	lPar);

		// ListView messages
		private const int LVM_FIRST					= 0x1000;
		private const int LVM_GETCOLUMNORDERARRAY	= (LVM_FIRST + 59);
		
		// Windows Messages
		private const int WM_PAINT = 0x000F;
		#endregion
		private struct EmbeddedControl
		{
			public Control Control;
			public int Column;
			public int Row;
			public DockStyle Dock;
			public ListViewItem Item;
		}

		private ArrayList _embeddedControls = new ArrayList();
		
		public ListViewEx() {
		
	 //   items alle weg ausser progressbar		
     //   SetStyle(System.Windows.Forms.ControlStyles.AllPaintingInWmPaint | System.Windows.Forms.ControlStyles.DoubleBuffer | System.Windows.Forms.ControlStyles.UserPaint, true);
      
		}

		protected int[] GetColumnOrder()
		{
			
		
			IntPtr lPar	= Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Columns.Count);

			IntPtr res = SendMessage(Handle, LVM_GETCOLUMNORDERARRAY, new IntPtr(Columns.Count), lPar);
			if (res.ToInt32() == 0)	// Something went wrong
			{
				Marshal.FreeHGlobal(lPar);
				return null;
			}

			int	[] order = new int[Columns.Count];
			Marshal.Copy(lPar, order, 0, Columns.Count);

			Marshal.FreeHGlobal(lPar);

			return order;
		}

	
		protected Rectangle GetSubItemBounds(ListViewItem Item, int SubItem)
		{
			Rectangle subItemRect = Rectangle.Empty;

			if (Item == null)
				throw new ArgumentNullException("Item");

			int[] order = GetColumnOrder();
			if (order == null) // No Columns
				return subItemRect;

			if (SubItem >= order.Length)
				throw new IndexOutOfRangeException("SubItem "+SubItem+" out of range");

			// Retrieve the bounds of the entire ListViewItem (all subitems)
			Rectangle lviBounds = Item.GetBounds(ItemBoundsPortion.Entire);
			int	subItemX = lviBounds.Left;

			// Calculate the X position of the SubItem.
			// Because the columns can be reordered we have to use Columns[order[i]] instead of Columns[i] !
			ColumnHeader col;
			int i;
			for (i=0; i<order.Length; i++)
			{
				col = this.Columns[order[i]];
				if (col.Index == SubItem)
					break;
				subItemX += col.Width;
			}
			subItemRect	= new Rectangle(subItemX, lviBounds.Top, this.Columns[order[i]].Width, lviBounds.Height);

			return subItemRect;
		}


		public void AddEmbeddedControl(Control c, int col, int row)
		{
			AddEmbeddedControl(c,col,row,DockStyle.Fill);
			
		}
control</param>
		public void AddEmbeddedControl(Control c, int col, int row, DockStyle dock)
		{
			if (c==null)
				throw new ArgumentNullException();
			if (col>=Columns.Count || row>=Items.Count)
				throw new ArgumentOutOfRangeException();
		EmbeddedControl ec;
		
			ec.Control = c;
			ec.Column = col;
			ec.Row = row;
			ec.Dock = dock;
			ec.Item = Items[row];

			_embeddedControls.Add(ec);

			// Add a Click event handler to select the ListView row when an embedded control is clicked
			c.Click += new EventHandler(_embeddedControl_Click);
			
			this.Controls.Add(c);
			
		}
		
		public Control GetEmbeddedControl(int col, int row)
		{
			foreach (EmbeddedControl ec in _embeddedControls)
			if (ec.Row == row && ec.Column == col)
					return ec.Control;
			return null;
			
		}
		[DefaultValue(View.LargeIcon)]
		public new View View
		{
			get 
			{
				return base.View;
			}
			set
			{

				foreach (EmbeddedControl ec in _embeddedControls)
					ec.Control.Visible = (value == View.Details);

				base.View = value;
		}
		}

		protected override void WndProc(ref Message m)
		{
			switch (m.Msg)
			{
				case WM_PAINT:
					if (View != View.Details)
						break;

					// Calculate the position of all embedded controls
					foreach (EmbeddedControl ec in _embeddedControls)
					{
						Rectangle rc = this.GetSubItemBounds(ec.Item, ec.Column);

						if ((this.HeaderStyle != ColumnHeaderStyle.None) &&
							(rc.Top<this.Font.Height)) // Control overlaps ColumnHeader
						{
							ec.Control.Visible = false;
							continue;
						}
						else
						{
							ec.Control.Visible = true;
						}

						switch (ec.Dock)
						{
							case DockStyle.Fill:
								break;
							case DockStyle.Top:
								rc.Height = ec.Control.Height;
								break;
							case DockStyle.Left:
								rc.Width = ec.Control.Width;
								break;
							case DockStyle.Bottom:
								rc.Offset(0, rc.Height-ec.Control.Height);
								rc.Height = ec.Control.Height;
								break;
							case DockStyle.Right:
								rc.Offset(rc.Width-ec.Control.Width, 0);
								rc.Width = ec.Control.Width;
								break;
							case DockStyle.None:
								rc.Size = ec.Control.Size;
								break;
						}

						// Set embedded control's bounds
						ec.Control.Bounds = rc;
						
				// Activate double buffering
					}
					break;
			}
			base.WndProc (ref m);
		}	
	}
}



wo genau muss ich dieses Setstyle einfügen ?? Habe schon ziemlich alles durch

thx im voraus 😉 😉

3.971 Beiträge seit 2006
vor 17 Jahren

Es gib zwei Funktionen, um das Flackern zu verhindert. Du rufst vor dem ändern die Funktion ListView.BeginUpdate() auf. Die Änderungen werden dann anschließend erst sichtbar wenn du die Funktione .Endupdate() aufrsufst.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

zunächst mal danke für die Atwort

hab das auch schon ausprobiert.


   	 listViewDown.BeginUpdate() ;  
   	  
    SetProgressBarValue( setter, row, sz);   
    SetKBSizeValue(setter, row);              
    w.Write(read, 0, bytes);  

 listViewDown.EndUpdate() ; 


erreicht wird, wieso auch immer, das gegenteil. Flackert noch mehr ?(

nochmals vielen Dank

3.971 Beiträge seit 2006
vor 17 Jahren

Original von Rolli

  
   	 listViewDown.BeginUpdate() ;    
   	    
    SetProgressBarValue( setter, row, sz);     
    SetKBSizeValue(setter, row);                
    w.Write(read, 0, bytes);    
  
 listViewDown.EndUpdate() ;   
  
  

Dieser Bereich wurde dann öfters hintereinander aufgerufen? Dann flankerts immernoch. Du muss wenn du auf einen Button klickst, bzw. wenn die Funktion aufgerufen wird BeginUpdate() aufgerufen werden und wenn die Funktion fertig ist, EndUpdate(). Dann hast du keine Probleme mehr mit Updates.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

ok hab ich probiert.

die funktion

public void writer()

beginnupdate

plaplapla
updaten....

end update

Ergebnis: items weg . . .

diese funktion wird (siehe mein erster post) durch Thread gestartet.
hängt das damit zuammen?

Hab auch schon probiert beim eventereignis in ListviewData beginn und endupdate.
funzt auch net.

S
1.047 Beiträge seit 2005
vor 17 Jahren

wo genau muss ich dieses Setstyle einfügen ?? Habe schon ziemlich alles durch

eigentlich in den konstruktor von deiner abgeleiteten listview
damit ist dann das flackern von listview weg...

public class DoubleBufferedListView : ListView {
    public DoubleBufferedListView() {
        this.DoubleBuffered = true;
    }
}

wenn jetzt noch was flackert dann bei den controls DoubledBuffered setzen
z.b. mal bei progressbar schaun mit doublebuffered

mal zu dem thema BeginUpdate() und EndUpdate():
ich hör bzw. les das oft wegen flackern unterdrücken... aber letztlich is das doch nur dafür gedacht beim ändern der liste das aktualisieren zu unterdrücken, z.b. wenn ich jetzt 1000 items in die listview nacheinander rein packe

ohne unterbrechung würde er nach jedem hinzugefügten die liste aktualisieren wollen, so kann man ihm gesteuert sagen er soll es erst nach dem letzen neu zeichnen

das hilft aber nichts wenn die listview beim resize z.b. flackert

3.971 Beiträge seit 2006
vor 17 Jahren

Also das mit dem Doppelbuffer, da bin ich mir ziemlich sicher, dass das hilft und funzt beim resizen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
1.047 Beiträge seit 2005
vor 17 Jahren

Original von kleines_eichhoernchen
Also das mit dem Doppelbuffer, da bin ich mir ziemlich sicher, dass das hilft und funzt beim resizen.

falls du das beziehst auf

das hilft aber nichts wenn die listview beim resize z.b. flackert

das war wiederum im bezug auf Begin-/EndUpdate 😉

flackern beim resize, verschieben -> DoubleBuffered nutzen

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

sorry für die späte antwort, bin gerade erst nach Hause gekommen.

die Progressbar "flackert nicht", aber alle anderen Items

this.DoubleBuffered = true;

ergibt bei mir den Fehler

....enthält keine Definition für 'DoubleBuffered'

( entwickle mit SharpDevelop ) hängts vielleicht an dem ?

und nochmals thx für die posts !

3.971 Beiträge seit 2006
vor 17 Jahren

Und wenn du im Konstruktor deines Forms


this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

this.listview.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

bzw. aufrufst?

Listview hat sogar eine eigene implementierung von DoubleBuffer. Ist erstens in Control implementiert und wird auch von der ListView-Klasse überschrieben.

Quele: Objekbrowser

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

Fehlermeldung:

enthält keine Definition für 'OptimizedDoubleBuffer'

das einzige was ohne Fehlermeldung funzt

SetStyle(ControlStyles.AllPaintingInWmPaint, true);

aber ohne Wirkung

(iss glaub ich aber nur für zeichnen zuständig, oder ??)

wie gesagt, hab mit das doublebuffer mehrmals "reingezogen", erhalte immer Fehlermeldung !

Was ist da nur faul ?

3.971 Beiträge seit 2006
vor 17 Jahren

Ich kann mich erinnern, als ich (noch) mit SharpDevelop programmiert hatte, das selbe Problem zu haben. Der VS Designer packt alles in Die Funktion InitalizeComponent().

Die Erste Anweisung ist dort this.SuspendLayout();. Dann folgen alle Einstellungen und die letzten zwei sind this.ResumeLayout(false);this.PerformLayout();. Wenn das in Develop nich sein sollte, probiers vllt. mal. Mehr als schaden kanns ja nich...

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
1.047 Beiträge seit 2005
vor 17 Jahren

welche .net version hast?
post mal den konstruktor wo der fehler auftritt

99 Beiträge seit 2006
vor 17 Jahren

Ich habe das Problem zu Doublebuffer so gelöst:

objListView.cs


using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace myTabelle
{
    class objListView : ListView
    {
        public objListView ()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
            ControlStyles.DoubleBuffer, true);
        }
    }
}


in meiner MainForm (frmMain.designer.cs)


...
private myTabelle.objListView myListview;
...

1. Googlen 2. Boardsuche benutzen 3. Überlegen 4. Posten

Ich sage es nur äußerst ungerne,aber darf man in Foren/wo auch immer eine klitzekleine Frage stellen,ohne dass gleich ein Oberlehrer mit der obligatorischen "Google suchen"-Antwort kommt?

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

Version 2 + german language pack

und die anordnung vom SharpDevelop (legt der automatisch so an)

sieht folgend aus:



	public  TCPClient()
	{
		
	InitializeComponent();
				
	SetStyle( ControlStyles.AllPaintingInWmPaint
| ControlStyles.DoubleBuffer
| ControlStyles.ResizeRedraw, true );			
				
			// TODO: Add constructor code after the InitializeComponent() call.
		
}


private void InitializeComponent() {
			
this.components = new System.ComponentModel.Container();
		
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TCPClient));
this.textBoxProxy = new System.Windows.Forms.TextBox();


//hier die Flackernde Listview

			// listViewDown
			// 
			this.listViewDown.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
						this.ico,
						this.Fnam,
						this.KBSize,
						this.loaded,
						this.Progress,
						this.Status,
						this.Hashcod});
			this.listViewDown.FullRowSelect = true;
			this.listViewDown.GridLines = true;
			this.listViewDown.Location = new System.Drawing.Point(0, 8);
			this.listViewDown.Name = "listViewDown";
			this.listViewDown.Size = new System.Drawing.Size(552, 200);
			this.listViewDown.SmallImageList = this.imageList1;
			this.listViewDown.TabIndex = 0;
			this.listViewDown.View = System.Windows.Forms.View.Details;
			


		
usw usw

thisResumeLayout(false);

}


Die Fehlermeldung kommt immer in der Zeile wo Doublebuffered true steht, also egal wo.

thx

S
1.047 Beiträge seit 2005
vor 17 Jahren

Schau dir mal SteelWarrior's Code und Beitrag genau an, und diesen Code hier nochmal:

public class DoubleBufferedListView : ListView {
    public DoubleBufferedListView() {
        this.DoubleBuffered = true;
    }
}

Erstell eine neue Klasse, die von ListView erbt. Dort im Konstruktor setzt du DoubleBuffered auf true sonst nichts.

Dann benutzt du diese Klasse anstelle der eingebauten ListView.

3.971 Beiträge seit 2006
vor 17 Jahren

Kleine Frage so neben bei

System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(TCPClient));

was speicherst du (alles noch) so in deinen Ressourcen?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

ok..

ich habe bereits eine Klasse, die von Listview erbt.
(siehe ganz oben - ListviewEmbeddedControl) - > für die Progressbar

wenn ich dort setStyle (.......) einsetze sind die Items, ausser Progressbar alle weg.

dass iss ja das, was ich net raff. ?(

S
1.047 Beiträge seit 2005
vor 17 Jahren

hm... ich nehm mal an das liegt an der implementation, weil er ja eine bestimmte windowsnachricht abfängt um die controls zu platzieren...

durch das SetStyle könnte sichdie nachricht ändern... darum nehm mal nicht kein SetStyle sondern schreib

DoubleBuffered = true;
R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

nee, iss nich ! 😉

this.DoubleBuffered = true;

ergibt Fehler

....enthält keine Definition für 'DoubleBuffered

S
1.047 Beiträge seit 2005
vor 17 Jahren

mach mal ne neue klasse und schreib da das hier rein
namespaces noch importieren

public class DoubleBufferedListView : ListView {
    public DoubleBufferedListView() {
        this.DoubleBuffered = true;
    }
}

geht die zu compilieren?

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

hallo sheitman
danke für deine (eure) Mühe
😁





using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace myTabelle
{
    class objListView : ListView
    {
        public objListView ()
        {
            this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
            ControlStyles.DoubleBuffer, true);
        }
    }
}



hier kommt ein Fehler, kennt kein Generic. Ohne Generic funzt das 👍
in meiner MainForm müsste ich


private myTabelle.objListView listViewDown;

aufrufen.

Aber ich hab doch schon listViewDown mit


private ListViewEmbeddedControls.ListViewEx listViewDown;

aufgerufen. Wie soll ich das denn anstellen ?

thx

S
1.047 Beiträge seit 2005
vor 17 Jahren

nein es ging lediglich darum ob es funktionert 🙂

wenn er generic nicht kennt, dann hast du vielleicht doch kein .net 2.0?
denn DoubleBuffered fand er auch nicht und das war auch neu in .net 2.0...

nichts desto trotz, das problem bleibt bestehen

public ListViewEx() {
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer | ControlStyles.UserPaint, true);
}

wäre das ja, aber da hast du den effekt das die controls nicht angezeigt werden

ursache ist vermutlich hier

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_PAINT:
                    if (View != View.Details)
                        break;

                    // Calculate the position of all embedded controls
                    foreach (EmbeddedControl ec in _embeddedControls)
                    {
                        Rectangle rc = this.GetSubItemBounds(ec.Item, ec.Column);

                        if ((this.HeaderStyle != ColumnHeaderStyle.None) &&
                            (rc.Top<this.Font.Height)) // Control overlaps ColumnHeader
                        {
                            ec.Control.Visible = false;
                            continue;
                        }
                        else
                        {
                            ec.Control.Visible = true;
                        }

                        switch (ec.Dock)
                        {
                            case DockStyle.Fill:
                                break;
                            case DockStyle.Top:
                                rc.Height = ec.Control.Height;
                                break;
                            case DockStyle.Left:
                                rc.Width = ec.Control.Width;
                                break;
                            case DockStyle.Bottom:
                                rc.Offset(0, rc.Height-ec.Control.Height);
                                rc.Height = ec.Control.Height;
                                break;
                            case DockStyle.Right:
                                rc.Offset(rc.Width-ec.Control.Width, 0);
                                rc.Width = ec.Control.Width;
                                break;
                            case DockStyle.None:
                                rc.Size = ec.Control.Size;
                                break;
                        }

                        // Set embedded control's bounds
                        ec.Control.Bounds = rc;
                        
                // Activate double buffering
                    }
                    break;
            }
            base.WndProc (ref m);
        } 

denn der code ist dafür verantwortlich deine controls anzuzeigen und zu verschieben...
schau mal ob er noch in WM_PAINT rein geht...
z.b. mit

case WM_PAINT:
  System.Diagnostic.WriteLine("WM_PAINT aufgerufen");
  if (View != View.Details)
    break;

ausgabe steht im debugoutput

R
Rolli Themenstarter:in
30 Beiträge seit 2006
vor 17 Jahren

hab mal das Framework 2 de- und wieder installiert, hab jetz keine Fehlermeldungen bezüglich Doublebuffer, dafür ein paar andere X(

Da war / ist irgendwo der Wurm drin.

thx an alle 👍

P
1 Beiträge seit 2007
vor 17 Jahren

Hi,

Du musst im Konstruktor der Kindklasse ListViewEx den Konstruktor der Basisklasse aufrufen. Der führt nämlich alle notwendigen Initialisierungen durch. Ohne diesen Aufruf kann das natürlich alles nix werden. Dass Ihr alle so vollständig im Dunkeln getappt seid, macht mich übrigens etwas betroffen. Gibt wohl noch ne Menge zu lernen.

class ListViewEx : ListView {
  public ListViewEx() : base() {
    DoubleBuffered = true;
  ...
  }
...
}

verwende ich hier und das Flackern ist vollständig verschwunden.

Das ": base()" führt dazu, dass der Konstruktor von ListViewEx zunächst den Konstruktor der Basisklasse aufruft. Typischerweise rufen alle Konstruktoren immer den Konstruktor der Basisklasse auf. Bei normalen Methoden (also keine Konstruktoren) erreicht man das mit dem Schlüsselwort override. Das Thema hierzu heisst Polymorphie und Überschreiben (nicht zu verwechseln mit Überladen). Die Eigenschaft DoubleBuffered ist übrigens geschützt, weshalb sie nur von innerhalb der Klassendefinition aufgerufen werden kann und bei der Anwendung auf ein Objekt der Klasse (AListViewEx.DoubleBuffered) nicht aufgelöst wird.

Viele Grüße und Viel Erfolg,

Björn

D
123 Beiträge seit 2004
vor 17 Jahren

Hallo zusammen.

Ich weiß, dass das Thema schon lange geschlossen ist und ich will auch sicher nicht rumklugscheißern.
Ich habe nur ähnliche Probleme mit dem ListView-Control und bin über die Suche in dieser Diskussion gelandet. Für alle, die noch nach mir hier landen, soll nur zumindest am Ende etwas "richtiges" stehen, wenn ich selbst die Lösung schon nicht geben kann.

Mit dem "base"-Schlüsselwort hat das Ganze nichts zu tun!
"base" (bei Konstruktoren) ist lediglich dafür da, um ggf. überladene Konstruktoren der Basisklasse zu steuern. Gibt man "base" nicht an, wird standardmäßig der parameterlose Konstruktor der Basisklasse aufgerufen.

Ich selbst habe auch schon alles ausprobiert, um das Flackern beim Sortieren von den Items wegzubekommen; keine Chance. Theoretisch soll DoubleBuffered ja helfen, praktisch ist es aber für die Katz! SuspendLayout/ResumeLayout bzw. BeginUpdate/EndUpdate bringen auch nichts. ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, alles schon ausprobiert - Essig!
Das ListView flackert eben; ich habe noch nirgends eine brauchbare Lösung gefunden.

Liebe Grüße, _void

5.299 Beiträge seit 2008
vor 15 Jahren

Ein Grund mehr, für Tabellen DataGridView zu nehmen - Vergleich DatagridView - ListView

Der frühe Apfel fängt den Wurm.