日期:2014-05-18  浏览次数:20650 次

强烈需要各位高手来回答这道简单的题目!!!
protected   void   DropDownList1_SelectedIndexChanged(object   sender,   EventArgs   e)
        {
                DropDownList   Drop1   =   (DropDownList)GridView1.FindControl( "DropDownList1 ");
                Label9.Text   =   Drop1.SelectedItem.Text;
        }

错误是: "Label9.Text   =   Drop1.SelectedItem.Text;未将对象引用设置到对象的实例 "
虽然可以用(DropDownList)sender来做!!但我还是想问怎么访问GridView1中的模板列控件呢????我用上述的方法,怎么老提示错误啊?具体是怎么来访问它呢??


------解决方案--------------------
GridView是个表格控件,它只包含行和列等子控件,你在GV里放的其它控件会重复出现,你直接GridView1.FindControl( "DropDownList1 ") 找不到的,因为GV有5行,就会生成5个DropDownList1, 你不指定是哪一行, .NET就无法找得你要的DropDownList1
------解决方案--------------------
理由同上

做法如下
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList Drop1 = (DropDownList)sender;
Label9.Text = Drop1.SelectedItem.Text;
}

如果你的Label9也在容器控件里就必须要它先FindControl出来
------解决方案--------------------
我不是高手,可是还来看看,个人认为,GridView中间的项是行形式的,而你的DropdownList控件位于GridView中,当绑定数据后,DropDownList访问所有的行,就出现问题。你把这个事件写到GridView中的RowCreate事件中,在该事件中动态产生你要的SelectedIndexChanged事件。
------解决方案--------------------
楼主你
DropDownList Drop1 = (DropDownList)GridView1.FindControl( "DropDownList1 ");
中 FindControl( "DropDownList1 ") 找到的是个集合
再附给 Drop1 就已经错误了,所以会报 "未将对象引用设置到对象的实例 "

DropDownList Drop1 = (DropDownList)sender;
中是把选中的项(即以object类型传过来的sender)转为DropDownList
所以Drop1 中有值,再SelectedItem.Text就能用了
(个人浅见)
------解决方案--------------------
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList Drop1 = (DropDownList)sender;

GridViewRow row = Drop1.NamingContainer as GridViewRow; // 当前 DropDownList 所在的行
DropDownList Drop2 = row.FindControl( "DropDownList1 "); // 只能在当前 DropDownList 所在的行去找, 对于 FindControl 方法,涉及一个“命名容器(NamingContainer)“的概念,此方法在调用此方法的控件所在的“命名容器”中查找目标控件

Response.Write(Drop1.Equal(Drop2)); // true
}
------解决方案--------------------
// GridView 相关事件
... RowDataBound( ...
// OR
// ... RowCreated(
{
DropDownList drp = e.Row.FindControl( "DropDownList1 ") as DropDownList;
if(drp != null) {
// more codes .....
}
}

// 遍历
foreach(GridViewRow row in GridView1.Rows) {
DropDownList drp = row.FindControl( "DropDownList1 ") as DropDownList;
if(drp != null) {
// more codes .....
}
}


Good Luck!