gpt4 book ai didi

c# - 自定义控件不会在 Visual Studio 设计器中更新

转载 作者:太空狗 更新时间:2023-10-29 21:45:52 24 4
gpt4 key购买 nike

我正在创建一个布局单选按钮的自定义控件(不,它不一定是单选按钮。我只是想学习如何做到这一点,这样我就可以制作一些更复杂的东西可能包含多个控件列表),它们是通过 Items 属性添加的(类似于其他一些控件)。

我可以构建项目,将其从组件面板拖到窗体上,然后通过 Items 属性添加单选按钮。不幸的是,这不会在设计器中更新,除非您:

  • 重建项目 2-3 次
  • 在设计器中关闭并重新打开表单

起初我的逻辑是在 Initialize 之后将这些放在构造函数中包含的表单上,但那不起作用,所以我转到了 Form_Load。

我错过了什么?上述选项只是短期的解决方法,而不是解决方案。

RBLTest.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WFCL_Library
{
public partial class RBLTest : UserControl
{
private List<RadioButton> _items;

private int leftSpacing = 100;
private int topSpacing = 25;

public RBLTest()
{
_items = new List<RadioButton>();
InitializeComponent();
}

private void RadioButtonList_Load(object sender, EventArgs e)
{
int curLeftPos = 0;
int curTopPos = 0;
foreach (RadioButton rb in _items)
{
rb.Location = new Point(curLeftPos, curTopPos);
rb.Size = new Size(85, 17);

curLeftPos += leftSpacing;

if (curLeftPos > this.Width)
{
curLeftPos = 0;
curTopPos += topSpacing;
}

this.Controls.Add(rb);
}
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<RadioButton> Items
{
get
{
return _items;
}
set
{
_items = value;
}
}
}
}

RBLTest.Designer.cs

namespace WFCL_Library
{
partial class RBLTest
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (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()
{
this.SuspendLayout();
//
// RBLTest
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Name = "RBLTest";
this.Size = new System.Drawing.Size(407, 44);
this.Load += new System.EventHandler(this.RadioButtonList_Load);
this.ResumeLayout(false);

}

#endregion

}
}

最佳答案

您不应使用 Load 事件或构造函数,因为当您使用设计器工具添加控件时,会创建一个 UserControl 实例,并且 Load 事件被触发。在您的情况下,发生这种情况时 _item 仍然是空的。另一个问题是序列化列表有一些问题,所以我会使用数组:

public partial class RBLTest : UserControl {
private RadioButton[] _items;

private int leftSpacing = 100;
private int topSpacing = 25;

public RBLTest( ) {
InitializeComponent( );
}

[DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
public RadioButton[] Items {
get {
return _items;
}
set {
_items = value;

int curLeftPos = 0;
int curTopPos = 0;
foreach ( RadioButton rb in _items ) {
rb.Location = new Point( curLeftPos, curTopPos );
rb.Size = new Size( 85, 17 );

curLeftPos += leftSpacing;

if ( curLeftPos > this.Width ) {
curLeftPos = 0;
curTopPos += topSpacing;
}

this.Controls.Add( rb );
}
}
}
}

表单设计器中的结果:

enter image description here

关于c# - 自定义控件不会在 Visual Studio 设计器中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12413626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com