设计时重绘

4
我创建了一个自定义的listview控件。我设置它每次添加新列时都会添加一个新的按钮。
当我运行包含自定义控件的程序时,列按钮被正确地放置。然而,在设计时,当我添加或删除列时,控件没有更新添加的按钮。
它们在运行时没问题,但在设计时,我需要关闭窗体并重新打开它(强制重新绘制),以更新列按钮。如何通过编程方式强制重绘我的用户控件?
Column属性看起来像这样:
   <MergableProperty(False)> _
   <Editor("System.Windows.Forms.Design.ColumnHeaderCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", GetType(UITypeEditor))> _
   <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
   <Localizable(True)> _
    Public ReadOnly Property Columns() As ListView.ColumnHeaderCollection
        Get
            Return ListView1.Columns
        End Get
    End Property

我尝试像这样重新绘制控件:

   Me.Invalidate()
   Dim x As New Rectangle With {.X = Me.Location.X, .Y = Me.Location.Y, .Size = Me.Size}
   Me.NotifyInvalidate(x)

但是由于某些原因,它无法正常工作。在设计时,每次我添加一列时,相应的按钮都没有被添加。


这段代码基本上能够正常工作。对于按钮是否与列标题相同并不清楚,我猜它们是一样的。同时,我还猜测您的控件正在加载ListView控件而不是从它继承。我在VS2012上进行了测试。 - LarsTech
是的,没错,我使用了一个ListView控件,我的控件只是添加了一些自定义样式的按钮作为该ListView的标题...由于某些原因,在设计模式下它们没有更新... - rusoaica
我建议你编辑你的帖子,加入一些关于你如何显示这些按钮的代码。 - LarsTech
我建议尝试使用IDesignerHost.Activate()和ISelectionService.SetSelectedComponents()进行实验。 - ezolotko
1个回答

1

只是一个快速的想法,可能不是最佳解决方案,但尝试一下不会有坏处,我猜它会起作用,即使如我所说,这并不是最好的方法。

在您用于添加/删除列的子程序中,添加以下内容:

Dim Graphics As Graphics = [yourform].CreateGraphics
Dim ParamArg As New PaintEventArgs(Graphics, [yourform].ClientRectangle)
InvokePaint(Me, ParamArgs)

每次添加/删除操作都会触发自动绘制,以确保该不好的东西被呈现出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接