在usercontrol中设置类的值

时间:2013-04-09 13:47:51

标签: c# asp.net .net user-controls

我正在尝试从其他页面代码设置用户控件中的类的值,并且无法使其工作。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class itemtest : System.Web.UI.UserControl
{
public DataRowView DataRowItem { get; set; }

public class Headers 
{
    public string strItems { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
    Headers hdrs = new Headers();
    string strItems = hdrs.strItems;

    if (strItems != null)
    {
        List<string> lstHeaders = strItems.Split(',').ToList<string>();
        DataTable dtHeaders = new DataTable();
        dtHeaders.Columns.Add("Header", typeof(String));
        dtHeaders.Columns.Add("Value", typeof(String));
        foreach (var item in lstHeaders)
        {
            DataRow drHeaders = dtHeaders.NewRow();
            drHeaders["Header"] = item.ToString();
            drHeaders["Value"] = DataRowItem[item.ToString()].ToString();
            dtHeaders.Rows.Add(drHeaders);
        }
        rptHeaders.DataSource = dtHeaders;
        rptHeaders.DataBind();
    }
}

}

和我的其他page.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ListViewTest : System.Web.UI.Page
{
public string strTableHeaders;
public DataRowView DataRowItem { get; set; }

protected void Page_Load(object sender, EventArgs e)
{
    strTableHeaders = "UserID,MachineName";
}

protected void lvExample_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        itemtest itemHeaders = (itemtest)e.Item.FindControl("itemsMain");
        if (itemHeaders != null)

            itemHeaders.Headers.strItems = strTableHeaders;


    }
}
}

我收到错误 编译器错误消息:CS0572:'标题':无法通过表达式引用类型;试试'itemtest.Headers'吧 换行 itemHeaders.Headers.strItems = strTableHeaders;

谁有人帮帮我?我对此很新,所以lamen条款最好

由于

编辑: 我的旧方法只是

public DataRowView DataRowItem { get; set; }
public string strItems { get; set; }

protected void Page_Load(object sender, EventArgs e)
{
    if (strItems != null)
    {
        List<string> lstHeaders = strItems.Split(',').ToList<string>();...

但似乎正在发生的事情是我的usercontrol页面加载事件在listview_itemdatabound事件之前触发,我不知道这是怎么可能的,因为usercontrol仅用于listview ...

因此strItems始终为null并且我的页面加载失败

2 个答案:

答案 0 :(得分:0)

这一行:

public class Headers 
{
    public string strItems { get; set; }
}

只声明新类型。他们没有实例化它。但是这一行:

itemHeaders.Headers.strItems = strTableHeaders;

尝试执行以下操作:在itemHeaders获取成员Headers(实际上只是声明了一些可以实例化[创建]的新类型)并将其成员strItem设置为strTableHeaders

解决方案很简单。将此行添加到您的班级itemtest

public Headers Hdrs { get; set; }

Headers类实例化为名为Hdrs的成员属性。

PS:还请重新考虑这个概念。正如赫希所说,这不是正确的方法。我刚刚通过评论解决了你的问题。

答案 1 :(得分:0)

以下这行不正确:

itemHeaders.Headers.strItems = strTableHeaders;

它试图做的是重新分配Headers.strItems的含义。这显然不是你打算做的。您需要的是对Headers类对象的实际实例的公共引用,而不是类本身的定义。在您的UserControl中,您需要

private Headers _hdrs;
public Headers Hdrs 
{
    get
    {
        return _hdrs ?? (_hdrs = new Headers());
    }
}
public DataRowView DataRowItem { get; set; }

然后在您的页面中,您可以使用:

itemHeaders.Hdrs.strItems = strTableHeaders;

这实际上会在实例中分配值。