动态创建UserWebControl中的Repeater不能绑定值问题

chduguxue 2010-01-25 01:28:22
有一个UserWebControl,里面有个Repeater,我在页面加载了这个control,我之前不是动态创建,代码如下,是可以读出值来的。后来我改为动态的就老是对着 Repeater.DataSource = thisDataTable;说 “未将对象引用设置到对象的实例”

以下为正常的代码,放这里的目的是为了说明,DataTable的值不为空,绝对是对了的,错误代码请见后面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Manage.aspx.cs" Inherits="Manage" %>

<%@ Register TagPrefix="ManageWebControl" TagName="ManageHeadControl" Src="~/WebControls/ManageHead.ascx" %>
<%@ Register TagPrefix="ManageWebControl" TagName="AdminManageControl" Src="~/WebControls/AdminManageControl.ascx" %>

<html>
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<ManageWebControl:ManageHeadControl ID="head" runat="server" OnCallParent="CallParente"/>
<ManageWebControl:AdminManageControl ID="AdminManageControl" runat="server" Visible="false" />
</form>
</body>
</html>

public partial class Manage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void CallParente(object sender, EventArgs e)
{
if (((ManageHeadEvents)e).EventName.Equals("AdminManageLink_Click"))
{ AdminManageControl.Visible = true; }
}
}


public partial class WebControls_AdminManageControl : System.Web.UI.UserControl
{
public static DataTable thisDataTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
this.myDataBind();
}

public void myDataBind()
{
ReadTable readAdmin = new ReadTable();//这里是我调用的类,没有错的。能够保证DataTable里面是有值的
thisDataTable = readAdmin.ReadAdmin();
AdminManageRepeater.DataSource = thisDataTable;
AdminManageRepeater.DataBind();
}
}



以上代码运行正常,下面为动态生成的有问题代码。



<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Manage.aspx.cs" Inherits="Manage" %>

<%@ Register TagPrefix="ManageWebControl" TagName="ManageHeadControl" Src="~/WebControls/ManageHead.ascx" %>
<%@ Reference Control="~/WebControls/AdminManageControl.ascx" %>

<html>
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<ManageWebControl:ManageHeadControl ID="head" runat="server" OnCallParent="CallParente"/>
</form>
</body>
</html>

public partial class Manage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void CallParente(object sender, EventArgs e)
{
if (((ManageHeadEvents)e).EventName.Equals("AdminManageLink_Click"))
{
WebControls_AdminManageControl amc = new WebControls_AdminManageControl();
amc.myDataBind();
}
}
}

public partial class WebControls_AdminManageControl : System.Web.UI.UserControl
{
public static DataTable thisDataTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
this.myDataBind();
}
public void myDataBind()
{
ReadTable readAdmin = new ReadTable();
thisDataTable = readAdmin.ReadAdmin();
AdminManageRepeater.DataSource = thisDataTable;////它就老是说这里:“未将对象引用设置到对象的实例”,但是我的读取数据库,填充DataTable这些核心部分没有做任何改动啊。
AdminManageRepeater.DataBind();
}
}

...全文
138 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 anyqu 的回复:]
REAPTER是子控件。需先用FINDCONTROLS(“”)找到后再给其赋值!
[/Quote]
绑定事件是在子控件里面写的啊?还要find?
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fengyunshier 的回复:]
这不像是全部的代码吧,怎么看不出头绪

那里的错误说明你AdminManageRepeater为NULL
说明之前没有这控件,所以你要保证这个是在你动态生成控件之后的行为。
并且每次都要动态生成的,也就是动态生成这个动作不能放在ispostbock中,否则也会出错。
其实这样效率不高了,建议不要这样做。
[/Quote]
的确不是全部代码,填充DataTable部分没发上来,但是应该没问题吧,因为我用第一种方法的时候,都能够把值显示出来。
动态生成我没有放在ispostbock中,我是放在一个事件里面的,不知道有影响没有。如果不这么做,那么我要怎么做,效率才比较高了?其实我就是想实现在A Control里面点击按钮,然后主页面就加载B Control,并且B Control里面是一个Repeater,能够绑定值。请各位大哥指点指点
fengyunshier 2010-01-25
  • 打赏
  • 举报
回复
这不像是全部的代码吧,怎么看不出头绪

那里的错误说明你AdminManageRepeater为NULL
说明之前没有这控件,所以你要保证这个是在你动态生成控件之后的行为。
并且每次都要动态生成的,也就是动态生成这个动作不能放在ispostbock中,否则也会出错。
其实这样效率不高了,建议不要这样做。
tzs2304 2010-01-25
  • 打赏
  • 举报
回复
帮顶
anyqu 2010-01-25
  • 打赏
  • 举报
回复
REAPTER是子控件。需先用FINDCONTROLS(“”)找到后再给其赋值!
fengyoujie 2010-01-25
  • 打赏
  • 举报
回复
帮楼主顶了。
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
改成了这种
在页面加载的时候

WebControls_AdminManageControl amc = (WebControls_AdminManageControl)LoadControl("~/WebControls/AdminManageControl.ascx");
this.Form.Controls.Add(amc);
amc.myDataBind();

然后在Control控件里面这么写的


public static DataTable thisDataTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
//if (!IsPostBack)
//{
// this.myDataBind();
//}
}
protected void DeleteButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < AdminManageRepeater.Items.Count;i++)
{
CheckBox chb = (CheckBox)AdminManageRepeater.Items[i].FindControl("CheckBox1");
if (chb.Checked == true)
{
string AdminName;
AdminName = thisDataTable.Rows[i][0].ToString();
Delete delete = new Delete();
delete.DeleteAdmin(AdminName);
}
}
this.myDataBind();
}
public void myDataBind()
{
ReadTable readAdmin = new ReadTable();
thisDataTable = readAdmin.ReadAdmin();
AdminManageRepeater.DataSource = thisDataTable;
AdminManageRepeater.DataBind();
}

我相的是这样写,第一次加载的时候就能显示,而以后只有点了 DeleteButton 才会从新绑定数据
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fengyunshier 的回复:]
引用 7 楼 chduguxue 的回复:
现在我改了下,代码可以显示了,但是我点击Control里面的按钮时,整个Control控件就消失了,这是怎么回事啊?

if (!IsPostBack)
  {this.myDataBind();
  }



说了动态的部分不能放在这里面的,去掉if判断,直接每次都加载,
所以我说效率不好就是这个。
[/Quote]
恩,非常有道理。
那请问放在哪里比较好了?我现在是毫无头绪,希望赐教,谢谢。
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sunhahaha2 的回复:]
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            this.myDataBind();
        }
    }

这里的问题。
你点了按钮之后, IsPostBack就是true了, 这时就不会执行myDataBind, 所以你的东西就全不显示了
[/Quote]
但是我去掉 if (!IsPostBack)之后,还是一样的那个问题,我觉得很奇怪了。
fengyunshier 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chduguxue 的回复:]
现在我改了下,代码可以显示了,但是我点击Control里面的按钮时,整个Control控件就消失了,这是怎么回事啊?

if (!IsPostBack)
{this.myDataBind();
}

[/Quote]

说了动态的部分不能放在这里面的,去掉if判断,直接每次都加载,
所以我说效率不好就是这个。
sunhahaha2 2010-01-25
  • 打赏
  • 举报
回复
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.myDataBind();
}
}

这里的问题。
你点了按钮之后, IsPostBack就是true了, 这时就不会执行myDataBind, 所以你的东西就全不显示了
chduguxue 2010-01-25
  • 打赏
  • 举报
回复
现在我改了下,代码可以显示了,但是我点击Control里面的按钮时,整个Control控件就消失了,这是怎么回事啊?


public partial class WebControls_AdminManageControl : System.Web.UI.UserControl
{
public static DataTable thisDataTable = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.myDataBind();
}
}
protected void DeleteButton_Click(object sender, EventArgs e)
{
for (int i = 0; i < AdminManageRepeater.Items.Count;i++)
{
CheckBox chb = (CheckBox)AdminManageRepeater.Items[i].FindControl("CheckBox1");
if (chb.Checked == true)
{
string AdminName;
AdminName = thisDataTable.Rows[i][0].ToString();
Delete delete = new Delete();
delete.DeleteAdmin(AdminName);
}
}
//this.myDataBind();
}
public void myDataBind()
{
ReadTable readAdmin = new ReadTable();
thisDataTable = readAdmin.ReadAdmin();
AdminManageRepeater.DataSource = thisDataTable;
AdminManageRepeater.DataBind();
}
}

public partial class Manage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void CallParente(object sender, EventArgs e)
{
if (((ManageHeadEvents)e).EventName.Equals("AdminManageLink_Click"))
{
////就是这里加载的上面那个control的
WebControls_AdminManageControl amc = (WebControls_AdminManageControl)LoadControl("~/WebControls/AdminManageControl.ascx");
this.form1.Controls.Add(amc);
amc.myDataBind();
}
}

}

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧