Laden...

StackOverflowException und keine Ahnung warum

Erstellt von j3$u5 vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.658 Views
J
j3$u5 Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren
StackOverflowException und keine Ahnung warum

Hallo Gemeinde,

ich habe wie im Titel beschrieben ein Problem mit einer StackOverflowException.

Ich versuche eine DLL zu erstellen die eine ListView welche ich mit Combox'en edieren kann auch ColumnSorter möchte ich einbauen aber das kommt erst noch...

Die Exception wird in der MyListView Klasse beim Konstruktor ausgelöst. Die Klasse "Solo" funktioniert allerdings wunderbar! Die Exception tritt beim Debugen sofort auf.


namespace ChangeableListView
{
    /// <summary>
    /// Summary description for UserControl1.
    /// </summary>
    public class MyListView : System.Windows.Forms.ListView
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public MyListView()
        {
            // This call is required by the Windows.Forms Form Designer.
            InitializeComponent();

            // TODO: Add any initialization after the InitForm call
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                    components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion

        private const int WM_HSCROLL = 0x114;
        private const int WM_VSCROLL = 0x115;

        protected override void WndProc(ref Message msg)
        {
            // Look for the WM_VSCROLL or the WM_HSCROLL messages.
            if ((msg.Msg == WM_VSCROLL) || (msg.Msg == WM_HSCROLL))
            {
                // Move focus to the ListView to cause ComboBox to lose focus.
                this.Focus();
            }

            // Pass message to default handler.
            base.WndProc(ref msg);
        }
    }

    public partial class ListViewCB : UserControl
    {
        private ListViewItem lvi;
        private int ClickedColumn;
        public ItemClass Items;
        public ListViewCBColumnCollection Columns;
        

        public ListViewCB()
        {
            InitializeComponent();

            Items = new ItemClass();
            Columns = new ListViewCBColumnCollection();
            Columns.EventOnColumnAdd += new OnColumnAdd(Columns_EventOnColumnAdd);
            Columns.EventOnColumnRemove += new OnColumnRemove(Columns_EventOnColumnRemove);
        }

        void Columns_EventOnColumnRemove(int Index)
        {
            foreach(ColumnHeader c in LV.Columns)
            {
                if (c.DisplayIndex == Index)
                {
                    LV.Columns.Remove(c);
                    break;
                }
            }
            
        }

        void Columns_EventOnColumnAdd(int Index)
        {
            ColumnHeader ch = new ColumnHeader();
            ch.DisplayIndex = Index;
            ch.Name = Columns[Index].Name;
            ch.Text = Columns[Index].Text;
            ch.Width = Columns[Index].Width;
            

            LV.Columns.Add(ch);
        }

        

        private void FillLV()
        {
            
        }

        #region Change Items 

        private void LV_MouseUp(object sender, MouseEventArgs e)
        {
            lvi = this.LV.GetItemAt(e.X, e.Y);

            if (lvi == null)
                return;

            Rectangle ClickedItem = lvi.Bounds;
            ClickedItem.Y += this.LV.Top;
            ClickedColumn = 0;
            int ColumnWidth = this.LV.Left + 2;

            for (int i = 0; i < this.LV.Columns.Count; i++)
            {
                ColumnWidth += this.LV.Columns[i].Width;

                if (ColumnWidth > e.X)
                {
                    ClickedColumn = i;
                    break;
                }
            }

            ClickedItem.X += ColumnWidth - this.LV.Columns[ClickedColumn].Width;

            ClickedItem.Width = this.LV.Columns[ClickedColumn].Width;

            cB.Bounds = ClickedItem;
            cB.Visible = true;

        }

        private void cB_SelectedValueChanged(object sender, EventArgs e)
        {
            // Set text of ListView item to match the ComboBox.
            lvi.SubItems[ClickedColumn].Text = this.cB.Text;

            // Hide the ComboBox.
            this.cB.Visible = false;

        }

        private void cB_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Verify that the user presses ESC.
            switch (e.KeyChar)
            {
                case (char)(int)Keys.Escape:
                    {
                        // Reset the original text value, and then hide the ComboBox.
                        this.cB.Text = lvi.SubItems[ClickedColumn].Text;
                        this.cB.Visible = false;
                        break;
                    }

                case (char)(int)Keys.Enter:
                    {
                         //Hide the ComboBox.
                        this.cB.Visible = false;
                        break;
                    }
            }
        }

        #endregion

        public class ItemClass : ListViewCB
        {
            public ItemClass()
            { }

            public void Fill(DataSet DS)
            {
                
            }

            public void Clear()
            {
                base.LV.Items.Clear();
            }

            public void Add(ListViewItem LVI)
            {
                base.LV.Items.Add(LVI);
            }
        }

        private void LV_ColumnClick(object sender, ColumnClickEventArgs e)
        {

        }
    }
    
    partial class ListViewCB
    {
        /// <summary> 
        /// Erforderliche Designervariable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// Verwendete Ressourcen bereinigen.
        /// </summary>
        /// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Vom Komponenten-Designer generierter Code

        /// <summary> 
        /// Erforderliche Methode für die Designerunterstützung. 
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
            this.LV = new ChangeableListView.MyListView();
            this.cB = new System.Windows.Forms.ComboBox();
            this.SuspendLayout();
            // 
            // LV
            // 
            this.LV.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.LV.FullRowSelect = true;
            this.LV.GridLines = true;
            this.LV.Location = new System.Drawing.Point(0, 0);
            this.LV.Name = "LV";
            this.LV.Size = new System.Drawing.Size(402, 391);
            this.LV.TabIndex = 0;
            this.LV.UseCompatibleStateImageBehavior = false;
            this.LV.View = System.Windows.Forms.View.Details;
            this.LV.MouseUp += new System.Windows.Forms.MouseEventHandler(this.LV_MouseUp);
            this.LV.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.LV_ColumnClick);
            // 
            // cB
            // 
            this.cB.FormattingEnabled = true;
            this.cB.Location = new System.Drawing.Point(196, 181);
            this.cB.Name = "cB";
            this.cB.Size = new System.Drawing.Size(121, 21);
            this.cB.TabIndex = 1;
            // 
            // ListViewCB
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.Controls.Add(this.cB);
            this.Controls.Add(this.LV);
            this.DoubleBuffered = true;
            this.Name = "ListViewCB";
            this.Size = new System.Drawing.Size(402, 391);
            this.ResumeLayout(false);

        }

        #endregion

        private MyListView LV;
        private System.Windows.Forms.ComboBox cB;
    }

    public class ListViewCBColumn
    {
        #region Variablen 

        private string name; 
        private string text;
        private int index;
        private int width = 60;
        private Sort sortby = Sort.None;
        private Edit editby = Edit.None;

        #endregion

        #region Eigenschaften 

        public enum Sort
        {
            None = 0,
            ByInt = 1,
            ByString = 2
        }

        public enum Edit
        {
            None = 0,
            ByComboBox = 1
        }

        public string Name
        {
            get{ return name; }
            set{ name = value; }
        }
        
        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        public int Index
        {
            get { return index; }
            set { index = value; }
        }

        public int Width
        {
            get { return width; }
            set { width = value; }
        }
        
        public Sort SortBy
        {
            get { return sortby; }
            set { sortby = value; }
        }

        public Edit EditBy
        {
            get { return editby; }
            set { editby = value; }
        }

        #endregion

        #region Konstruktoren 

        public ListViewCBColumn()
        {
        }

        public ListViewCBColumn(string Text)
        {
            this.text = Text;
        }

        public ListViewCBColumn(string Text, int Width)
        {
            this.text = Text;
            this.width = Width;
        }
        
        public ListViewCBColumn(string Text, int Width, Sort Sortby)
        {
            this.text = Text;
            this.width = Width;
            this.sortby = Sortby;
        }

        public ListViewCBColumn(string Text, int Width, Sort Sortby, Edit Editby)
        {
            this.text = Text;
            this.width = Width;
            this.sortby = Sortby;
            this.editby = Editby;
        }
        
        public ListViewCBColumn(string Text, int Width, Sort Sortby, Edit Editby, string Name)
        {
            this.text = Text;
            this.width = Width;
            this.sortby = Sortby;
            this.editby = Editby;
            this.name = Name;
        }

        public ListViewCBColumn(string Text, int Width, Sort Sortby, Edit Editby, string Name, int Index)
        {
            this.text = Text;
            this.width = Width;
            this.sortby = Sortby;
            this.editby = Editby;
            this.name = Name;
            this.index = Index;
        }

        #endregion
    }

    public delegate void OnColumnAdd(int Index);
    public delegate void OnColumnRemove(int Index);

    [Serializable]
    public class ListViewCBColumnCollection : CollectionBase
    {
        #region Variablen 

        public event OnColumnAdd EventOnColumnAdd;
        public event OnColumnRemove EventOnColumnRemove;

        #endregion

        #region Constructors

        /// <summary>
        /// Standardkonstruktor.
        /// </summary>
        public ListViewCBColumnCollection()
        {
        }

        #endregion

        #region Default Collection Methods

        /// <summary>
        /// Ein Element zur Auflistung hinzufügen.
        /// </summary>
        /// <param name="value">Hinzuzufügendes Element</param>
        public int Add(ListViewCBColumn value)
        {
            CheckNull(value);
            int c = base.InnerList.Count;

            if (value.Name == null)
                value.Name = "Column" + c.ToString();
            if (value.Text == null)
                value.Text = "Column" + c.ToString();
            if (value.Index == null)
                value.Index = c;

            EventOnColumnAdd.Invoke(c);

            return base.InnerList.Add(value);
        }

        /// <summary>
        /// Füht die Elemente einer anderen Auflistung zu dieser Auflistung hinzu.
        /// </summary>
        /// <param name="c">Auflistung</param>
        public void AddRange(ICollection c)
        {
            base.InnerList.AddRange(c);
        }

        /// <summary>
        /// Ein Element aus der Auflistung entfernen.
        /// </summary>
        /// <param name="value">Zu entfernendes Element</param>
        public void Remove(ListViewCBColumn value)
        {
            base.InnerList.Remove(value);
            EventOnColumnRemove.Invoke(value.Index);
        }

        /// <summary>
        /// Element an einer bestimmten Position der Auflistung hinzufügen.
        /// </summary>
        /// <param name="index">Position</param>
        /// <param name="value">Einzufügendes Element</param>
        public void InsertAt(int index, ListViewCBColumn value)
        {
            CheckNull(value);
            
            if (value.Name == null)
                value.Name = "Column" + index.ToString();
            if (value.Text == null)
                value.Text = "Column" + index.ToString();
            if (value.Index == null)
                value.Index = index;

            EventOnColumnAdd.Invoke(index);

            base.InnerList.Insert(index, value);
        }

        /// <summary>
        /// Ermittelt den Index eines Elements innerhalb der Auflistung.
        /// </summary>
        /// <param name="value">Element des zu ermittelnden Indizes</param>
        /// <returns>Index des Elements</returns>
        public int IndexOf(ListViewCBColumn value)
        {
            return base.InnerList.IndexOf(value);
        }

        /// <summary>
        /// Bestimmt ob sich das angegebene Element innerhalb der Auflistung befindet.
        /// </summary>
        /// <param name="value">Zu suchendes Element</param>
        /// <returns>True, wenn gefunden</returns>
        public bool Contains(ListViewCBColumn value)
        {
            return base.InnerList.Contains(value);
        }

        #endregion

        #region Indexer

        /// <summary>
        /// Gibt das Element mit dem angegebenen Index zurück.
        /// </summary>
        public ListViewCBColumn this[int index]
        {
            get
            {
                return (ListViewCBColumn)base.InnerList[index];
            }
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Exception werfen, wenn übergebene Referenz null ist.
        /// </summary>
        /// <param name="value">Zu überprüfende Referenz</param>
        private void CheckNull(ListViewCBColumn value)
        {
            if (value == null)
            {
                throw new ArgumentNullException("value");
            }
        }

        #endregion
    }
}

für sonstige Anregungen und Kretik bin ich jederzeit offen gerade mit Vererbung und Verschachtelten Klassen habe ich wenig bis gar keine Erfahrung

Vielen Dank für Eure Hilfe

Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)

1.457 Beiträge seit 2004
vor 13 Jahren

Hallo j3$u5,

Das ist ein Fall von: [Hinweis] Wie poste ich richtig?. Leider bringt das ganze nicht viel was du gepostet hast. Es bringt leider nichts wenn wir nur wissen das eine StackOverflowException Class geworfen wird. Im Debugger kann man sehen was die Inner Exception noch anzeigt und wo der Fehler auftaucht.

J
j3$u5 Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

danke für deine schnelle antwort

die details der Ausname des Debuggers sind

Der Ausdruck kann nicht ausgewertet werden, weil sich der aktuelle Thread in einem Stapelüberlaufzustand befindet.

wenn ich woanders an weiter Infos komme weiß ich nicht wo bin aber gerne bereit es erfahren 😉

Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)

6.862 Beiträge seit 2003
vor 13 Jahren

Hallo,

wenn man so seltsamen Code schreibt ists kein Wunder 😉

Deine ItemClass ist ja von ListViewCB abgeleitet und das ist schlecht in deinem Fall. Du erstellst ein ListViewCB Objekt welches ein ItemClass Objekt erstellt, welches ja aber ein ListViewCB Objekt ist und von dem wiederum der Basiskonstruktor aufgerufen wird welcher wieder ein ItemClass Objekt erstellt usw.

Der Stacktrace sollte dir das bestätigen.

Aber wie Timur schon sagte, unbedingt [Hinweis] Wie poste ich richtig? besonders Punkt 4.1 berücksichtigen. Du hast viel zu viel unwichtigen Code gepostet.

Baka wa shinanakya naoranai.

Mein XING Profil.

J
j3$u5 Themenstarter:in
24 Beiträge seit 2009
vor 13 Jahren

vielen dank für deine antwort das war auch die lösung

für den vielen code möchte ich mich entschuldigen aber ich wusste nicht in welcher klasse der fehler liegt also hab ich alle relevanten gepostet

Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)