当前位置:编程学习 > C#/ASP.NET >>

变量定义控件名

int i;
        int j;
        for (i = 0; i <= 11; i++)
        {

            for (j = 0; j <= 7; j++)
            {
((Label)FindControl("LblTopicNum" + i)).Text= ds.Tables[0].Rows[0][1].ToString();


}
        }


我想这样通过循环给页面上的一些lable赋值,可是上面的代码提示未将对象引用到实例。大家帮忙啊! --------------------编程问答-------------------- 断点调试,看哪个对象是null --------------------编程问答-------------------- (Label)FindControl("LblTopicNum" + i)).Text
就这段代码一直提示未将对象引用到实例 --------------------编程问答-------------------- --------------------编程问答--------------------

//试试
(Label)FindControl("LblTopicNum" + i.ToString())).Text 
--------------------编程问答-------------------- 这样的错肯定是页面上没有找到相关ID的Label,如果你每次循环里面查找的Label不是页面都有的。
应该先找到Label,确定不为Null时,再赋值。
Label lb = FindControl("LblTopicNum" + i) as Label
if(lb != null)
{
   lb.Text = ds.Tables[0].Rows[0][1].ToString(); 
}

--------------------编程问答-------------------- 接点分

楼上的应该能解决问题吧

看这段代码在什么事件类型里,不是在什么里都能发现的,例如表格类型控件的头和脚 --------------------编程问答-------------------- 可能你认为页面上所有控件的id都不相同,不对!

举一个例子,你可以看到你在设计GridView时它模板中控件的id,运行时仅在同一行是唯一的,但是每一行中都有重复(同一列上),并且这个id完全可以与GridView以外的控件重名。类似的还有LoginView、Repeater等内部的控件,以及所有自定义的实现了INamingContainer接口的控件。

FindControl方法并不是查找当前控件的子控件,这是很多人误会的!

FindControl方法在搜索一个控件时,首先向上(向父控件)查找具有这个接口的控件(因此你会发现从GridView的任意个单元格调用FindControl都可以找到同一行中其它单元里的直接嵌入的控件id,可见),然后向下查找所有子控件,但是当遇到这个接口的控件时就不再像内部查找了。
--------------------编程问答-------------------- 你可以试试,在页面上简单地放两个label,从一个label控件调用FindCntrol(而不是从页面调用),可以查询到另一个label。但是你把另一放入Repeater控件内部,你就查不到了。

因此,不要把FindControl方法理解为“查询任意子控件”,根本不是这个意思。如果不了解,就不要轻易用这个方法。 --------------------编程问答-------------------- 还是上面这个例子,要想查找某行中的某个单元格中的Label,你必须从这一行(GridViewRow类型的对象)开始调用FindControl,或者甚至可以从任何一个单元格开始调用,甚至从一个无关的单元格中的某个控件开始调用,但是就是不能从GridView外边的某个控件(包括你的代码中的那种从Page开始)去掉用FindControl方法。 --------------------编程问答-------------------- 学习咯!! --------------------编程问答-------------------- 谢谢。因为gridview本身就实现INamingContainer接口,所以不会再往下走了,哎,要学的东西真多啊,活学活用,呵呵。
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,