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

gridview第一行模板列的控件取不到值~~第一行以后就正常了。很奇怪~在线等待,结帖;

我的目标是把gridview模板列中DropDownList1选中的值赋给Label3。 DropDownList1数据绑定成功了。现在的状况是:第一行的Label的文本不能显示,下面的行正常。代码如下~~~  
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    
 //所在区域的绑定;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            foreach (GridViewRow row in GridView1.Rows)
            {
                Label lb = (Label)e.Row.FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row .FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
            }
        }
}

我再多问一下这句代码:Label lb = (Label)e.Row.FindControl("Label3");为什么不能这样写:          Label lb = (Label)row.FindControl("Label3");



--------------------编程问答-------------------- 第一行不知道是怎么回事。至于附加问题,e是传入进来的参数“当前操作行”,如果你直接row.的话请问你是要操作哪一行?那样当然是错误的,而且没有row这个类吧?也就是说row是参数e里面的一个属性,请问你调用一个TextBox的Text属性可以直接Text而不写TextBox.Text吗? --------------------编程问答-------------------- 找到你的问题,你写在数据绑定事件里面怎么还要foreach?

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    
 //所在区域的绑定;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
                Label lb = (Label)e.Row.FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row .FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
}
这样就可以了
--------------------编程问答-------------------- 你的问题问的太稀奇了,自己好好想想就知道原因了。GridView1_RowDataBound到底是个什么事件,发生在什么时候,你难道没看清就稀里糊涂的写?
在DropDownList的选择时又是个什么事件,难道你认为这就是GridView1_RowDataBound的事件?! --------------------编程问答-------------------- 在你绑定的时候,那个时候DropDownList根本还没有SelectedItem,所以先前的显示肯定不会正常 --------------------编程问答-------------------- 如果按你的做法:这一句报错 lb.Text = ddl.SelectedItem.Text;

“未将对象引用设置到对象的实例。” --------------------编程问答-------------------- 老大教训的是:小弟还是个菜鸟~~~~~ --------------------编程问答-------------------- 行绑定事件,就是一行一行绑定上去的。 --------------------编程问答-------------------- if (e.Row.RowType == DataControlRowType.DataRow)
        {
           Label lb = (Label)e.Row.FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row .FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
在GridView1_RowDataBound事件里面就不用foreach了,你那是无用功.

我再多问一下这句代码:Label lb = (Label)e.Row.FindControl("Label3");为什么不能这样写:          Label lb = (Label)row.FindControl("Label3");
你如果一定要用foreach的话,那么可能不用在GridView1_RowDataBound事件里面写
就可以直接这样
public void changeGridView()
{
   foreach (GridViewRow row in GridView1.Rows)
            {
                Label lb = (Label)row.FindControl("Label3");
                DropDownList ddl = (DropDownList)row .FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
            }


}
这两种方法都可以

--------------------编程问答-------------------- 改成这样试试行不:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    
 //所在区域的绑定;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
                Label lb = (Label)protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    
 //所在区域的绑定;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
                Label lb = (Label)e.Row.Cells[0].FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row.Cells[0].FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
}("Label3");
                DropDownList ddl = (DropDownList)e.Row.Cells[0].FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
}

原因:对dataview控件来说row是它的某行,没有指定的某一列是找不到的!指定某一行的某一列! --------------------编程问答-------------------- 这种情况是程序把页头当做第一行了。
1把页头去了
2
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
        {
                Label lb = (Label)e.Row.FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row .FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
}
加上指定一个项型。选中项是Item 或AlternatingItem才执行就OK~1了
--------------------编程问答-------------------- 不用foreach了会报错:
这一句报错 lb.Text = ddl.SelectedItem.Text;

“未将对象引用设置到对象的实例。”
--------------------编程问答-------------------- protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    
 //所在区域的绑定;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
                Label lb = (Label)e.Row.Cells[0].FindControl("Label3");
                DropDownList ddl = (DropDownList)e.Row.Cells[0].FindControl("DropDownList1");
                lb.Text = ddl.SelectedItem.Text;
        }
}
--------------------编程问答-------------------- 郁闷~~~还是没搞定!!! --------------------编程问答-------------------- DropDownList ddl = (DropDownList)e.Row.Cells[ddl所在的列索引].FindControl("DropDownList1");
--------------------编程问答-------------------- label也这样写试试 --------------------编程问答-------------------- 试过了,不行的~~~~ --------------------编程问答-------------------- 我再多问一下这句代码:Label lb = (Label)e.Row.FindControl("Label3");为什么不能这样写:          Label lb = (Label)row.FindControl("Label3");
-----------------------------------------------------------------------------
当然不能那样写了,e是触发事件的行,你上面也判断了if(e.Row.RowType==DataControlRowType)
这样他在页面加载时 执行此事件  对你GridView中的每行进行绑定
你写成那样row 是什么东西? --------------------编程问答-------------------- 你把 HTML代码帖一下好吗
你是把 DropDownList1 和label放在一个模板列中还是分别两个列中?
你上面Label lb = (Label)e.Row.FindControl("Label3");这句代码 你加断点看一眼 lb是否被实力化了? --------------------编程问答-------------------- 既然dropdownlist都找到了  那label能找不到?
你label是动态添加的 绑定列? --------------------编程问答-------------------- 楼上说的对~我的dropdownlist是动态调用数据库的。
DropDownList1 和label放在一个模板列中的同一个单元格。 --------------------编程问答-------------------- 奇怪的就是第一行中的模板列中不能绑定数据。
dropdownlist连接的数据库,dropdownlist取不到数据,从第二行开始就正常了~~~~ --------------------编程问答-------------------- 都不知道他们回答什么,他们根本就瞎猜。
其实这问题的根本原因就是定义了TemplateField之后没有先设置HeaderTemplate,结果使数据绑定时将第一个列当作列头。 --------------------编程问答--------------------
引用 2 楼 morixing 的回复:
找到你的问题,你写在数据绑定事件里面怎么还要foreach?

protected   void   GridView1_RowDataBound(object   sender,   GridViewRowEventArgs   e)
        {        
  //所在区域的绑定;
                if   (e.Row.RowType   ==   DataControlRowType.DataRow)
                {
                                Label   lb   =   (Label)e.Row.FindControl( "Label3 ");
                                DropDownList   ddl   =   (DropDownList)e.Row   .FindControl( "DropDownList1 ");
                                lb.Text   =   ddl.SelectedItem.Text;
                }
}
这样就可以了

这个应该是对的! --------------------编程问答--------------------
引用 2 楼 morixing 的回复:
找到你的问题,你写在数据绑定事件里面怎么还要foreach?

protected   void   GridView1_RowDataBound(object   sender,   GridViewRowEventArgs   e)
        {        
  //所在区域的绑定;
                if   (e.Row.RowType   ==   DataControlRowType.DataRow)
                {
                                Label   lb   =   (Label)e.Row.FindControl( "Label3 ");
                                DropDownList   ddl   =   (DropDownList)e.Row   .FindControl( "DropDownList1 ");
                                lb.Text   =   ddl.SelectedItem.Text;
                }
}
这样就可以了


很好很强大。 --------------------编程问答-------------------- 07年的帖子都 被 你们挖出来,太厉害 了!
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,