如何在Web用户控件中添加列表字典(如何初始化新方法)?

时间:2009-04-03 13:44:14

标签: c# .net asp.net

我创建了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()));
            }
        }

BUT !!

如果我添加我的网页此Web用户控件。并写下以下代码:

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的新方法,但是如何?

3 个答案:

答案 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;
    }
 }

希望这有帮助,