我正在开发一个调试应用程序,我正在构建一个表单(基于System.Windows.Form的一个非常小的扩展),该表单用于构造函数并为每个参数创建一个新的Parameter控件在构造函数中。
我目前的问题是,由于某种原因,我的ParameterControls正被添加到表单中,但只有添加的第一个才会在操作结束时显示。
有问题的代码和支持方法;如下:
class ConstructorDialog : Namespace.Forms.Form
{
protected void InitializeInterface()
{
if (this.TargetType == null)
{
throw new InvalidOperationException("Cannot GenerateFields for ConstructorDialog. ConstructorDialog TargetType is null.");
}
else if (this.TargetConstructor == null)
{
}
else
{
foreach( ParameterInfo Parameter in this.TargetConstructor.GetParameters())
{
try
{
ParameterControl NewParameterControl = new ParameterControl(Parameter);
NewParameterControl.Location = new Point(0, 30 + (30 * Parameter.Position));
this.AddControl(NewParameterControl);
continue;
}
catch (Exception e)
{
}
}
return;
}
}
}
class Namespace.Forms.Form : System.Windows.Forms.Form
{
public Control AddControl(Control Control)
{
if (Control == null)
throw new InvalidOperationException("Form cannot AddControl. Control is null.");
else
{
this.Controls.Add(Control);
return Control;
}
}
}
class Namespace.Debugging.ParameterControl : Namespace.Forms.UserControl
{
protected void InitializeInterface()
{
if (this.TargetParameter == null)
{
throw new InvalidOperationException("Cannot InitializeInterface for ConstructorParameterControl. ConstructorParameterControl TargetParameter is null.");
}
else
{
this.Controls.Clear();
this.AddLabel(this.TargetParameter.Name + "_Label", this.TargetParameter.Name, new Point(25,0));
return;
}
}
}
class Namespace.Forms.UserControl : System.Windows.Forms.UserControl
{
public Label AddLabel(String LabelName, String LabelText, Point Location)
{
if (String.IsNullOrEmpty(LabelName))
throw new ArgumentNullException();
else if (String.IsNullOrEmpty(LabelText))
throw new ArgumentNullException();
else
{
Label NewLabel = new Label();
NewLabel.Name = LabelName;
NewLabel.Text = LabelText;
NewLabel.Location = Location;
return this.AddLabel(NewLabel);
}
}
public Label AddLabel(Label Label)
{
if (Label == null)
throw new ArgumentNullException();
else
{
this.Controls.Add(Label);
return Label;
}
}
}
我的表格扩展仍处于起步阶段,所以我很可能忽略了某些事情(特别是因为我的表格知识只是学徒值得的),但这个操作看起来很简单,在我的评估中应该有效。
一些调试信息:
The controls are being added to the base 'Controls' collection.
The positions of the controls are being set to what they ought to, so it is not a matter of them overlapping.
No exceptions are encountered during execution.
答案 0 :(得分:1)
正如@sysexpand所建议的那样,我手动设置ParameterControl对象的高度和宽度,并将'Visible'属性设置为true,似乎已经解决了问题。
我对此的评估是,在ParameterControl是其父项的成员之前设置这些变量,当控件添加到其父项时,这些变量将被覆盖。