我有一个隐藏的控件,其中包含一个文本框控件,我想设置文本框的文本属性,但我得到一个NullReferenceException。但是,如果我显示控件,设置值然后隐藏它然后我没有例外。
miStatus1.Show();
miStatus1.ioItem1.popIoItem(caseState);
miStatus1.Hide();
然而,这感觉就像一个非常不洁净且不太优雅的方式。而且我看到了一些闪烁,因为我必须对4个控件执行此操作,每个控件最多包含8个文本框。
在隐藏控件时,有没有办法设置文本框的文本属性?或者在显示控件时填充我的文本框可能更好吗?并且这会减慢我的应用程序,因为它需要在每次显示控件时填充吗?
popIoItem - 代码
public void popIoItem(object obj){
if (ioType == 1)
{
tb.Text = (string)obj;
}
}
我的界面
我试图在右边创建菜单,每次按下类别菜单向上/向下滑动,我用文本框和其他io元素隐藏/显示正确的用户控件。
更多代码
点击左侧的其中一个框后,将运行以下方法:
public void openMenu(int caseNum)
{
caseDB.casesDataTable chosenCase;
chosenCase = _casesAdapter.GetDataByID(caseNum);
string caseName = "";
int caseOwner = -1;
DateTime caseDate = DateTime.Today;
string caseDesc = "";
int caseState = -1;
foreach (caseDB.casesRow casesRow in chosenCase)
{
if (!casesRow.IscaseNameNull())
caseName = casesRow.caseName;
if (!casesRow.IscaseCreatedByNull())
caseOwner = casesRow.caseCreatedBy;
if (!casesRow.IscaseCreatedNull())
caseDate = casesRow.caseCreated;
if (!casesRow.IscaseDescNull())
caseDesc = casesRow.caseDesc;
if (!casesRow.IscaseStateNull())
caseState = casesRow.caseState;
}
int caseJobs = (int)_jobsAdapter.JobCount(caseNum);
string caseStateStr = Enum.GetName(typeof(caseState), caseState);
caseInfoMenu1.popMenu(caseName, caseOwner, caseDate, caseDesc,caseJobs,caseStateStr);
}
caseInfoMenu是右侧菜单。它包含一些绘制和鼠标逻辑,可以绘制菜单并处理命中检测。除此之外,它还包含4个用户控件,每个用户控件对应一个垂直选项卡。
public void popMenu(string caseName, int caseOwner ,DateTime caseDate, string caseDesc, int caseJobs, string caseState)
{
marked = 0;
miGeneral1.Show();
miEconomy1.Hide();
miStatus1.Hide();
miHistory1.Hide();
miGeneral1.ioItem1.popIoItem(caseName);
miGeneral1.ioItem2.popIoItem(caseOwner.ToString());
miGeneral1.ioItem3.popIoItem(caseDate.ToShortDateString());
miGeneral1.ioItem4.popIoItem(caseJobs.ToString());
miGeneral1.ioItem5.popIoItem(caseDesc.ToString());
//miStatus1.ioItem1.popIoItem(caseState);
//This is commented out because it makes the application crash. However if I show miStatus1, set the value and hide it, it does not crash.
this.Invalidate();
}
在这些用户控件中,我有io-items用户控件,它基本上绘制一个蓝色框并将控件放在if之前。文本框。
public partial class ioItem : UserControl
{
public int ioType { get; set; }
public int ioPadding { get; set; }
RichTextBox tb;
public ioItem()
{
InitializeComponent();
}
public void popIoItem(object obj){
if (ioType == 1)
{
tb.Text = (string)obj;
}
}
private void ioItem_Load(object sender, EventArgs e)
{
switch (ioType)
{
case 1:
tb = new RichTextBox();
tb.Location = new System.Drawing.Point(ioPadding, ioPadding);
tb.Name = "textbox";
tb.Size = new Size(this.Size.Width - (ioPadding * 2), this.Size.Height - (ioPadding * 2));
tb.BorderStyle = BorderStyle.None;
tb.Visible = true;
tb.BackColor = Color.FromArgb(255, 184, 198, 208);
tb.Font = new Font("Microsoft Sans Serif", 7);
this.Controls.Add(tb);
break;
case 2:
historyCtrl hiCtrl = new historyCtrl();
hiCtrl.Location = new Point(0,0);
hiCtrl.Size = new Size(this.Width, this.Height);
hiCtrl.Name = "history";
hiCtrl.Visible = true;
hiCtrl.BackColor = Color.FromArgb(255, 184, 198, 208);
this.Controls.Add(hiCtrl);
break;
default:
goto case 1;
}
}
}
答案 0 :(得分:1)
尝试使用调试器检查代码。可能还有其他内容吗? NullReference意味着您尝试对不存在的对象执行某些操作。显示/隐藏只是在正常情况下将控件的可见属性设置为true / false(没有自定义重载/ Control类的更改)。
答案 1 :(得分:1)
所以我想出了什么是错的。这个问题不是我最初的预期。它不起作用的原因是因为我在Load_event中创建了我的文本框控件。当我尝试设置文本框控件的text属性的值时,尚未创建它们。我之所以创建包含文本框的用户控件的原因是为了便于将它们拖动到Designer中的屏幕中。我发现了这个讨论'UserControl' constructor with parameters in C#,它向我展示了另一种方法,现在它可行。