【发布时间】:2019-12-04 18:52:22
【问题描述】:
我在 Visual Studio 2019 中创建了一个 C# 用户控件。它有一个名为“BoundLayout”的属性。
public Layout BoundLayout
{
get
{
return _Layout;
}
set
{
_Layout = value as Layout;
if (_Layout == null)
{
MessageBox.Show("Value submitted is not of type 'LAYOUT'","Invalid Value",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
else
{
InitializeControl();
}
}
}
如果程序尝试为属性分配不兼容的值,则会在 MessageBox 中显示错误消息。这可以正常工作。
非常奇怪的是,当我构建(而不是运行)项目时,此错误消息会显示在其模态 MessageBox 中,在您返回 Visual Studio 之前必须确认该消息。在调试和发布模式下构建时会发生这种情况。添加到属性集代码的断点不会被触发。构建成功完成,没有错误或警告,我可以运行应用程序。
应用程序(包括此用户控件)按预期运行。我以前从未遇到过这种行为。还有其他人吗?
用户控件的完整(仍在开发中)代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Dispatcher
{
public partial class DivisionModuleGrid : UserControl
{
private Layout _Layout = null;
private ObservableListSource<LayoutDivision> _LayoutDivisions;
private DivisionModulesList _activeDivision = null;
private int _divisionCount;
public Layout BoundLayout
{
get
{
return _Layout;
}
set
{
_Layout = value as Layout;
if (_Layout == null)
{
MessageBox.Show("Value submitted is not of type 'LAYOUT'","Invalid Value",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
else
{
InitializeControl();
}
}
}
public DivisionModulesList ActiveDivision
{
get
{
return _activeDivision;
}
set
{
_activeDivision = value as DivisionModulesList;
if (_activeDivision != null)
{
lbl_ActiveDivision.Text = _activeDivision.DivisionName;
}
else
{
lbl_ActiveDivision.Text = "-No Active Division-";
}
}
}
public DivisionModuleGrid()
{
InitializeComponent();
}
private void InitializeControl()
{
_LayoutDivisions = _Layout.LayoutDivisions;
_divisionCount = _LayoutDivisions.Count;
tbx_LayoutName.Text = _Layout.LayoutName;
// Grid Layout divide into Rows & Columns
int tlp_rows = _divisionCount / 3;
TableLayoutPanel tlp = (TableLayoutPanel)(Controls.Find("tlp_DivisionGrid", false)[0]);
DivisionModulesList dml;
foreach (LayoutDivision ld in _LayoutDivisions)
{
dml = new DivisionModulesList(ld);
dml.BoundDivision = ld;
tlp.Controls.Add(dml);
}
}
private void Tlp_DivisionGrid_Paint(object sender, PaintEventArgs e)
{
}
}
}
【问题讨论】:
-
摆脱这种情况的最佳方法是弄清楚如何优雅地处理
null值(例如,改用new Layout())。我想说 MessageBox.Show() 根本不应该在 UserControl 属性的设置器中 - 只需抛出一个异常,记录它,它就不再是你的问题了。我猜 setter 是从设计器或属性窗口触发的 -
要添加到@ASh 的评论中,您在这里尝试做的太多了。
UserControl在技术上是另一个UI控件,并且应该如此。如果可以的话,它的工作应该是显示它给出的数据。不要尝试显示错误消息。
标签: c# .net winforms user-controls windows-forms-designer