Lsteinme Geschrieben 13. Juni 2013 Teilen Geschrieben 13. Juni 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 13. Juni 2013 Autor Teilen Geschrieben 13. Juni 2013 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 14. Juni 2013 Autor Teilen Geschrieben 14. Juni 2013 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 14. Juni 2013 Autor Teilen Geschrieben 14. Juni 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.