Zum Inhalt springen

Ein ToolStripMenuItem, mehrere Werte


Lsteinme

Empfohlene Beiträge

Hallolo,

folgendes Problem: ich habe für einen DGV mit evtl vielen Columns einen Contextmenustrip eingebaut, in dem man die angezeigen spalten auswählen kann. Da ich vorher mit dem Cms noch nie gearbeitet habe, bitte ich um Nachsicht, wenn ich mich grad mal wieder wie der Hahn zum Eier legen anstelle^^

hier der Code dazu:


Dim items(5 + Process_Dict.Count) As ToolStripMenuItem

            Dim count As Integer = 0

            For Each c As DataGridViewColumn In accessor.DGV.Columns

                If (c.HeaderText.Equals("Dkey") Or c.HeaderText.Equals("key")) Then

                    c.Visible = False

                    Continue For

                End If

                Dim item As New ToolStripMenuItem(c.HeaderText)

                item.CheckOnClick = True

                If My.Settings.Cols.Contains(item.Text) Then

                    item.Checked = True

                End If

                AddHandler item.Click, AddressOf ShowOrHideColumns

                items(count) = (item)

                c.HeaderCell.ContextMenuStrip = accessor.ColumnStrip

                If Not (My.Settings.Cols.Contains(c.HeaderText)) Then

                    c.Visible = False

                End If

                count += 1

            Next

            accessor.ColumnStrip.Items.AddRange(items)

Das problem ist jetzt aber, das jede Column die ich anklicke einen eigenen Cms zu haben scheint.

Wenn ich jetzt aber in Column 1 ein item ankreuze, dann wird das zwar versteckt/gezeigt, aber in allen anderen Columns ist das gleiche item immernoch nicht angekreut.

Was ist da los?

Gruß

Lucas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nachtrag: durch kleinere Tests hab ich raus gefunden, das aus irgend einem Grund bei mir insgesammt n+1 Contextmenustrip existieren wobei n die anzahl der spalten ist.

nämlich der eigentliche ColumnStrip sowie für jede Column ein eigener Strip.

Erfahren hab ich das in dem ich die Hashwerte der Objekte verglichen hab die ein Open Event auslösen

ich kann mir jedoch nicht erklären woran das liegt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok ich hab nochmal bisle am Ablauf rum geforscht, es sieht so aus, als ob irgendwo während der Laufzeit, an einem Punkt, auf den ich keinen Einfluss habe, die Referenz auf eine Art Clon geändert wird.

Nach der Inizialen zuweisung des CMS an die Columns, sind die Objekte nämlich, laut Hashcode, alle die gleichen.

Der Unterschied tritt erst beim öffnen des CMS über den Columns auf.

Ich weis aber mit absoluter Sicherheit, das ich zwischen der inizialisierung und der öffnung des Strips im Code NICHTS mit dem CMS der einzelnen Columns mache.

kennt jemand so ein Problem und kann mir ne Lösung verraten? Ich wär auch schon froh wenn mir jemand sagen könnte, was das System veranlasst von einem Objekt, ohne expliziten Cloneaufruf, eine Kopie anzufertigen und diese zuzuweisen.

Denn die Objekte sind Semantisch, bis auf die checked/unchecked werte gleich, alle haben die Gleichen items.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier mal eine Kurzversion des Codes der die bugs hervorruf:

Logischer Teil:

Public Class Form1

    Dim contstrip As ContextMenuStrip

    Sub New()


        ' This call is required by the designer.

        InitializeComponent()


        ' Add any initialization after the InitializeComponent() call.

        Dim dt As New DataTable("testtable")

        Dim dv As New DataView

        dv.Table = dt

        dt.Columns.AddRange({New DataColumn("Col1"), New DataColumn("Col2"), New DataColumn("Col3")})

        Dgv.DataSource = dv

        contstrip = New ContextMenuStrip(Me.components)

        AddHandler contstrip.Opening, AddressOf openhandler

        For Each col As DataGridViewColumn In Dgv.Columns

            col.HeaderCell.ContextMenuStrip = contstrip

            Dim item As New ToolStripMenuItem(col.HeaderText)

            AddHandler item.Click, AddressOf clickhandler

            item.Checked = True

            item.CheckOnClick = True

            contstrip.Items.Add(item)

        Next

    End Sub

    Public Sub clickhandler()


    End Sub

    Public Sub openhandler(sender As System.Object, e As System.ComponentModel.CancelEventArgs)

        Dim refofStrip As Integer = contstrip.GetHashCode

        Dim refoffirstitem As Integer = contstrip.Items(0).GetHashCode

        Dim refofsender As Integer = sender.GetHashCode

    End Sub

End Class
Designer:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _

Partial Class Form1

    Inherits System.Windows.Forms.Form


    'Form overrides dispose to clean up the component list.

    <System.Diagnostics.DebuggerNonUserCode()> _

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)

        Try

            If disposing AndAlso components IsNot Nothing Then

                components.Dispose()

            End If

        Finally

            MyBase.Dispose(disposing)

        End Try

    End Sub


    'Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer


    'NOTE: The following procedure is required by the Windows Form Designer

    'It can be modified using the Windows Form Designer.  

    'Do not modify it using the code editor.

    <System.Diagnostics.DebuggerStepThrough()> _

    Private Sub InitializeComponent()

        Me.components = New System.ComponentModel.Container()

        Me.Dgv = New System.Windows.Forms.DataGridView()

        Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)

        CType(Me.Dgv, System.ComponentModel.ISupportInitialize).BeginInit()

        Me.SuspendLayout()

        '

        'Dgv

        '

        Me.Dgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize

        Me.Dgv.Dock = System.Windows.Forms.DockStyle.Fill

        Me.Dgv.Location = New System.Drawing.Point(0, 0)

        Me.Dgv.Name = "Dgv"

        Me.Dgv.Size = New System.Drawing.Size(588, 463)

        Me.Dgv.TabIndex = 0

        '

        'ContextMenuStrip1

        '

        Me.ContextMenuStrip1.Name = "ContextMenuStrip1"

        Me.ContextMenuStrip1.Size = New System.Drawing.Size(61, 4)

        '

        'Form1

        '

        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)

        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font

        Me.ClientSize = New System.Drawing.Size(588, 463)

        Me.Controls.Add(Me.Dgv)

        Me.Name = "Form1"

        Me.Text = "Form1"

        CType(Me.Dgv, System.ComponentModel.ISupportInitialize).EndInit()

        Me.ResumeLayout(False)


    End Sub

    Friend WithEvents Dgv As System.Windows.Forms.DataGridView

    Friend WithEvents ContextMenuStrip1 As System.Windows.Forms.ContextMenuStrip


End Class

Realcode is zwar komplizierter, tut aber mit dem CMS nicht mehr

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...