DataSet zerstört Form.Designer-Code für eigene Klassen

  • VB.NET
  • .NET 5–6

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    DataSet zerstört Form.Designer-Code für eigene Klassen

    Edit für alle die DataSets nutzen mögen: Aktueller Stand: ist behoben.

    Hallo,

    Ich verwende eine CircularProgressBar Klasse aus dem Netz.

    Kompilieren, dann aufs Form ziehen. Das funktioniert alles prima. Wenn ich ein DataSet hinzufüge, produziert mir der Designer aber sofort Fehlermeldungen.

    Quellcode

    1. Der Typ "ProjectName.CircularProgressBar" ist nicht definiert.
    2. "CircularProgressBar" ist kein Member von "ProjectName.ProjectName".
    3. "CircularProgressBar" ist kein Member von "ProjectName.ProjectName".

    Bei ProjectName.ProjectName liegt der Hase im Pfeffer, es gibt natürlich keine Klasse ProjectName im Namespace ProjectName.
    (Beheben kann ich sie indem ich im Designer selbst nochmal rumwurstel und den Namespace vor der Klasse entferne, aber das kann ja nicht Sinn der Sache sein)

    Wenn ich das DataSet wieder lösche, dann verschwindet dieser Fehler. Das heißt dann sucht der Designer nicht mehr ProjectName.ProjectName.CircularProgressBar, sondern richtigerweise ProjectName.CircularProgressBar.
    Also irgendwie verdoppelt mir das DataSet das Projekt.

    CircularProgressBar

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Public Class CircularProgressBar
    3. Inherits UserControl
    4. Public Enum _ProgressShape
    5. Round
    6. Flat
    7. End Enum
    8. Public Enum _TextMode
    9. None
    10. Value
    11. Percentage
    12. [Custom]
    13. End Enum
    14. Private _Value As Integer = 0
    15. Private _Maximum As Integer = 100
    16. Private _LineWitdh As Integer = 5
    17. Private _BarWidth As Single = 11
    18. Private _ProgressColor1 As Color = Color.Orange
    19. Private _ProgressColor2 As Color = Color.Orange
    20. Private _LineColor As Color = Color.LightGray
    21. Private _GradientMode As LinearGradientMode = LinearGradientMode.ForwardDiagonal
    22. Private ProgressShapeVal As _ProgressShape
    23. Private ProgressTextMode As _TextMode
    24. Private _ShadowOffset As Single = 0
    25. Public Sub New()
    26. MyBase.SuspendLayout()
    27. 'SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.SupportsTransparentBackColor Or ControlStyles.Opaque, True)
    28. SetStyle(ControlStyles.SupportsTransparentBackColor, True)
    29. SetStyle(ControlStyles.Opaque, True)
    30. BackColor = SystemColors.Control
    31. ForeColor = Color.DimGray
    32. Size = New Size(75, 75)
    33. Font = New Font("Segoe UI", 15)
    34. MinimumSize = New Size(40, 40)
    35. DoubleBuffered = True
    36. LineColor = Color.LightGray
    37. Value = 50
    38. ProgressShape = _ProgressShape.Flat
    39. TextMode = _TextMode.Percentage
    40. MyBase.ResumeLayout(False)
    41. MyBase.PerformLayout()
    42. End Sub
    43. '<Description("Integer Value that determines the position of the Progress Bar."), Category("Behavior")>
    44. Public Property Value() As Long
    45. Get
    46. Return _Value
    47. End Get
    48. Set
    49. If Value > _Maximum Then
    50. Value = _Maximum
    51. End If
    52. _Value = Value
    53. Invalidate()
    54. End Set
    55. End Property
    56. '<Description("Gets or Sets the Maximum Value of the Progress bar."), Category("Behavior")>
    57. Public Property Maximum() As Long
    58. Get
    59. Return _Maximum
    60. End Get
    61. Set
    62. If Value < 1 Then
    63. Value = 1
    64. End If
    65. _Maximum = Value
    66. Invalidate()
    67. End Set
    68. End Property
    69. '<Description("Initial Color of Progress Bar"), Category("Appearance")>
    70. Public Property BarColor1() As Color
    71. Get
    72. Return _ProgressColor1
    73. End Get
    74. Set
    75. _ProgressColor1 = Value
    76. Invalidate()
    77. End Set
    78. End Property
    79. '<Description("Final Color of Progress Bar"), Category("Appearance")>
    80. Public Property BarColor2() As Color
    81. Get
    82. Return _ProgressColor2
    83. End Get
    84. Set
    85. _ProgressColor2 = Value
    86. Invalidate()
    87. End Set
    88. End Property
    89. '<Description("Progress Bar Width"), Category("Appearance")>
    90. Public Property BarWidth() As Single
    91. Get
    92. Return _BarWidth
    93. End Get
    94. Set
    95. _BarWidth = Value
    96. Invalidate()
    97. End Set
    98. End Property
    99. '<Description("Modo del Gradiente de Color"), Category("Appearance")>
    100. Public Property GradientMode() As LinearGradientMode
    101. Get
    102. Return _GradientMode
    103. End Get
    104. Set
    105. _GradientMode = Value
    106. Invalidate()
    107. End Set
    108. End Property
    109. '<Description("Color de la Linea Intermedia"), Category("Appearance")>
    110. Public Property LineColor() As Color
    111. Get
    112. Return _LineColor
    113. End Get
    114. Set
    115. _LineColor = Value
    116. Invalidate()
    117. End Set
    118. End Property
    119. '<Description("Width of Intermediate Line"), Category("Appearance")>
    120. Public Property LineWidth() As Integer
    121. Get
    122. Return _LineWitdh
    123. End Get
    124. Set
    125. _LineWitdh = Value
    126. Invalidate()
    127. End Set
    128. End Property
    129. '<Description("Get or Set the Shape of the progress bar terminals."), Category("Appearance")>
    130. Public Property ProgressShape() As _ProgressShape
    131. Get
    132. Return ProgressShapeVal
    133. End Get
    134. Set
    135. ProgressShapeVal = Value
    136. Invalidate()
    137. End Set
    138. End Property
    139. '<Description("Modo del Gradiente de Color"), Category("Appearance")>
    140. Public Property ShadowOffset() As Integer
    141. Get
    142. Return _ShadowOffset
    143. End Get
    144. Set
    145. If Value > 2 Then
    146. Value = 2
    147. End If
    148. _ShadowOffset = Value
    149. Invalidate()
    150. End Set
    151. End Property
    152. '<Description("Get or Set the Mode as the Text is displayed inside the Progress bar."), Category("Behavior")>
    153. Public Property TextMode() As _TextMode
    154. Get
    155. Return ProgressTextMode
    156. End Get
    157. Set
    158. ProgressTextMode = Value
    159. Invalidate()
    160. End Set
    161. End Property
    162. Protected Overloads Overrides Sub OnResize(e As EventArgs)
    163. MyBase.OnResize(e)
    164. SetStandardSize()
    165. End Sub
    166. Protected Overloads Overrides Sub OnSizeChanged(e As EventArgs)
    167. MyBase.OnSizeChanged(e)
    168. SetStandardSize()
    169. End Sub
    170. Protected Overloads Overrides Sub OnPaintBackground(p As PaintEventArgs)
    171. MyBase.OnPaintBackground(p)
    172. End Sub
    173. Private Sub SetStandardSize()
    174. Dim _Size As Integer = Math.Max(Width, Height)
    175. Size = New Size(_Size, _Size)
    176. End Sub
    177. Public Sub Increment(Val As Integer)
    178. _Value += Val
    179. Invalidate()
    180. End Sub
    181. Public Sub Decrement(Val As Integer)
    182. _Value -= Val
    183. Invalidate()
    184. End Sub
    185. 'Protected Overloads Overrides Sub OnPaint(e As PaintEventArgs)
    186. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    187. Using bitmap As New Bitmap(Width, Height)
    188. Using graphics As Graphics = Graphics.FromImage(bitmap)
    189. graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
    190. graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
    191. graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
    192. graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
    193. graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
    194. PaintTransparentBackground(Me, e)
    195. Dim rect As Rectangle = New Rectangle(10, 10, MyBase.Width - 20, MyBase.Width - 20)
    196. Using mBackColor As Brush = New SolidBrush(BackColor)
    197. graphics.FillEllipse(mBackColor, rect)
    198. End Using
    199. Using pen2 As New Pen(LineColor, LineWidth)
    200. graphics.DrawEllipse(pen2, rect)
    201. End Using
    202. Using brush As New LinearGradientBrush(ClientRectangle, _ProgressColor1, _ProgressColor2, GradientMode)
    203. Using pen As New Pen(brush, BarWidth)
    204. Select Case ProgressShapeVal
    205. Case _ProgressShape.Round
    206. pen.StartCap = LineCap.Round
    207. pen.EndCap = LineCap.Round
    208. Exit Select
    209. Case _ProgressShape.Flat
    210. pen.StartCap = LineCap.Flat
    211. pen.EndCap = LineCap.Flat
    212. Exit Select
    213. End Select
    214. graphics.DrawArc(pen, rect, -90, CType((360 / _Maximum) * _Value, Integer))
    215. End Using
    216. End Using
    217. Select Case TextMode
    218. Case _TextMode.None
    219. Text = String.Empty
    220. Exit Select
    221. Case _TextMode.Value
    222. Text = _Value.ToString()
    223. Exit Select
    224. Case _TextMode.Percentage
    225. Text = Convert.ToString((100 / _Maximum) * _Value) & "%"
    226. Exit Select
    227. Case _TextMode.Custom
    228. Text = Text
    229. Exit Select
    230. Case Else
    231. Exit Select
    232. End Select
    233. If Text IsNot String.Empty Then
    234. Dim MS As SizeF = graphics.MeasureString(Text, Font)
    235. Dim shadowBrush As New SolidBrush(Color.FromArgb(100, ForeColor))
    236. If ShadowOffset > 0 Then graphics.DrawString(Text, Font, shadowBrush, (Width / 2 - MS.Width / 2) + ShadowOffset, (Height / 2 - MS.Height / 2) + ShadowOffset)
    237. graphics.DrawString(Text, Font, New SolidBrush(ForeColor), (Width / 2 - MS.Width / 2), (Height / 2 - MS.Height / 2))
    238. End If
    239. MyBase.OnPaint(e)
    240. e.Graphics.DrawImage(bitmap, 0, 0)
    241. graphics.Dispose()
    242. End Using
    243. End Using
    244. End Sub
    245. Private Shared Sub PaintTransparentBackground(c As Control, e As PaintEventArgs)
    246. If c.Parent Is Nothing OrElse Not Application.RenderWithVisualStyles Then
    247. Return
    248. End If
    249. ButtonRenderer.DrawParentBackground(e.Graphics, c.ClientRectangle, c)
    250. End Sub
    251. Private Sub FillCircle(g As Graphics, brush As Brush, centerX As Single, centerY As Single, radius As Single)
    252. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
    253. g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
    254. g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality
    255. g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias
    256. Using gp As New System.Drawing.Drawing2D.GraphicsPath()
    257. g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius)
    258. End Using
    259. End Sub
    260. End Class
    (Mit einer anderen Klasse auch getestet DoubleTrackBar, selbes Problem)

    Falls ihr das selbst mal begucken wollt:
    Ich habe das Projekt so hochgeladen wie es noch funktioniert, wenn ich bei diesem nun ein DataSet hinzufüge, kaputt.
    Wenn das bei euch nicht so ist, lade ich auch gern den Zustand mit DataSet nochmal hoch.
    (Da ist eine CircuProgBar schon aufm Form, die seht ihr evtl. erst nach dem kompilieren)

    Was kann man da machen?

    Viele Grüße
    Dateien
    • TestReduziert.zip

      (710,8 kB, 64 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Das weiß ich nicht. Dieses Projekt findet explizit seinen Sinn in .Net 6.
    Es gibt eine alte Version davon in 4.6. Dort scheinen DataSet und CircularProgressBar friedlich auszukommen, allerdings habe ich da kein DataSet hinzugefügt oder abgebaut.

    Wenn man bedenkt, dass ich alles aus dem Programm entfernt habe, was nicht zum Problem gehört, dann wird es vermutlich an der Version liegen. Also ja ich denke in 4.6 geht es

    Wenn jemand anders das in Net 6 auch hat, dann kann man wohl nix machen.

    Haudruferzappeltnoch schrieb:

    Also ja ich denke in 4.6 geht es
    Du solltest Dich davon überzeugen.
    Erstell eine Sicherheitskopie und editiere das Projekt entsprechend.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    ist es nicht nachstellbar.
    AHa.
    Dann scheint es ein Net-Problem zu sein.
    Du kannst ja mal das Net-6-Projekt nach Net 5 umstellen, das sollte funktionieren, und dort testen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es besteht auch in NET 5. Ich habe dennoch die Vermutung dass es an mir liegt.

    Wenn ich ein DataSet hinzufüge kann ich es zum Beispiel auch nicht wie in 4.6 adressieren mit DataSet1
    Er schlägt hier vor ProjectName.DataSet1 oder Imports ProjectName, das verstehe ich alles nicht, irgendwo ist da doch was doppelt.

    Das Problem lässt sich sogar mit dieser Klasse reproduzieren:

    VB.NET-Quellcode

    1. Public Class TestControl
    2. Inherits Control
    3. End Class

    Neues Net 6 Projekt, Klasse einfügen, kompilieren, Klasse aufs Form ziehen und DataSet hinzufügen. Kann das jemand mal nachstellen?

    Am Ende krieg ich das Programm zum laufen aber man muss händisch in den Designer.

    Wichtig Edit: Wenn ich ProjectName.DataSet1 dann nutze und über ProjectName hover, dann steht da "Namespace ProjectName.ProjectName"
    Im Objektexplorer finde ich auch beides tatsächlich. "{} ProjectName" und "{} ProjectName.ProjectName"
    wobei ersteres die normalen Sachen des Forms beinhaltet und letzteres alles zum DataSet1

    Oder arbeitet in NEt 6 keiner mehr mit DataSet?
    Kann man einen Namespace aus dem Projekt löschen?


    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Das bedeutet: Du kannst ihn mit kurzem/nicht-förmlichen Text eine eMail bezüglich des Problems schreiben. Er wird hier wohl nicht sooo oft vorbeischauen, sondern eher (D)eine Mail lesen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn Du da die neueste VS 2022 Version (also die Updates dafür) drauf hast, solltest Du Klaus anschreiben. Denn dann ist der Designer (als Teil von VS) up to date.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Bin ich ein Außenseiter mit .NET 6 DataSets?
    Vermutlich.
    EF ist doch viel neuer und toller, und Dataset isso uralt.
    Wer auf .net 6 geht, ist vermutlich viel zu fortschrittlich für sowas.
    Aber zu deim Trost: Wir switchen auch demnächst auf .net 6, und nehmen das olle Ding mit (weil da ist Datenhaltung und Datenzugriff klar getrennt, und ist nützlich auch ohne Datenbank).
    Also vielen Dank, dass du mich auf dieses Problem aufmerksam machtetest!
    Hallo,

    ich dachte ich geb mal die Info hier durch: Das Problem wurde behoben in VS 17.5

    Es wird wie in Post 7 zu sehen weiterhin der Namespace Projectname.Projectname erzeugt, wenn ein DataSet verwendet wird.
    Aber der Form-Designer schreibt jetzt nicht mehr alles aus.
    Wo sonst New Projectname.TestClass erzeugt wurde, wird nun nur noch New TestClass erzeugt.
    Gilt so nun auch bei normalen Controls, wo vorher New System.Windows.Forms.Button stand steht nun New Button

    Funktioniert ohne Frage. Aber warum braucht das DataSet überhaupt seinen eigenen Namespace? In Framework gehts ja ohne.