我创建了Web用户控件。它的属性包括ListDictionary;但我无法生成
在web uset控件中。如果我在asp.net页面尝试wuc,它会给出初始化错误:
“对象引用未设置为对象的实例。”
WEB用户控制:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
FillList1();
}
}
public String OrderClause
{
get { return Session["selecteditem"].ToString(); }
set { Session["selecteditem"] = value; }
}
private ListDictionary items;
public ListDictionary Items
{
get { return items; }
set { items = value; }
}
void FillList1()
{
foreach (string ky in Items.Keys)
{
ListBox1.Items.Add(new ListItem(ky, Items[ky].ToString()));
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
WebUserControl2_1.Items.Add("Yusuf", "1");
WebUserControl2_1.Items.Add("Gulden", "2");
}
}
protected void btn_test_Click(object sender, EventArgs e)
{
lbl_test.Text = WebUserControl2_1.OrderClause.Trim();
}
错误点:WebUserControl2_1.Items.Add(“Yusuf”,“1”);
我需要在web用户控件中使用listdictionary的新方法,但是如何?
答案 0 :(得分:2)
您在没有首先实例化该字段的情况下引用Items属性。所以要求该项将导致NullReferenceException。我喜欢延迟加载方法,所以当你需要它时,如果它是null,那么它将实例化它。
在吸气剂中你可以简单地放
if(items == null)items = new ListDictionary();
return items;
但是你需要考虑国家管理。您有一些选项,包括ViewState和ControlState。
安德鲁
答案 1 :(得分:0)
您实际上从未在 items 变量中实例化ListDictionary的实例 在这段代码中:
private ListDictionary items;
public ListDictionary Items
{
get { return items; }
set { items = value; }
}
将其更改为:
private ListDictionary items;
public ListDictionary Items
{
get { if (items == null) {items = new ListDictionary}; return items; }
set { items = value; }
}
答案 2 :(得分:0)
你犯了几个错误。首先,所有属性都应该有一种方法来在回发之间存储它们的值。处理此问题的简单方法是通过viewstate。
这篇文章提供了有关此主题的更多详细信息 http://www.codeguru.com/csharp/.net/net_asp/controls/article.php/c11971/
第二,如果它是一个集合,它更像是你只需要一个吸气剂,因为你将操纵收集而不是取代整个集合。
所以你的代码应该是这样的:
public ListDictionary Items
{
get
{
object o = ViewState["Items"];
if (o == null)
{
ViewState["Items"] = new ListDictionary;
o = ViewState["Items"];
}
return (ListDictionary) o;
}
}
希望这有帮助,