为什么不能显示数据,我在gridview中添加DropdownList控件 代码如下

时间:2022-10-27 19:21:16
  protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList DropDownList1 = (DropDownList)GridView1.FindControl("DropDownList1");
        string sql = "select Priority from [User] ";
        SqlDataAdapter da = new SqlDataAdapter(sql, DBHelper.Connection);
        DataSet ds = new DataSet();
        da.Fill(ds);
        DropDownList1.DataSource = ds;
        DropDownList1.DataTextField = "Priority";
        DropDownList1.DataValueField = "Priority";
        DropDownList1.DataBind();
    }

8 个解决方案

#1


page或gridview的DataBind有没有调用 ?
没做过,建议一下。

#2


DropDownList1_SelectedIndexChanged 的意思是当DropDownListt1控件的改变的时候才出发的事件。

你的这段代码不应该在这个事件里面写。

应该是在Gridview控件加载一个事件里面写。

#3


FindControl方法遇到具有 INamingContainer 接口控件就停止再向里边查找了。如果你要找,你应该直接给出它的 INamingContiner 范围。例如
Gridview1.Rows[3].FindControl("drp")。


要知道,每一行都可能有一个ID是DropDownList1的控件呢!因此页面上至少有很多个DropDownList1呢,不是一个。

#4


看看GRidView的行的定义
public class GridViewRow : TableRow, IDataItemContainer, INamingContainer
{
当你看到它有INamingContainer,就应该知道FindControl代码该如何写。

看看那msdn:  http://msdn.microsoft.com/zh-cn/library/486wc64h.aspx
要注意它写的:在 当前的命名容器中搜索带指定 id 参数的服务器控件。这个命名容器,就是指 NamingContainer。

从一个控件对象上调用FindControl方法的机制,是首先找到这个对象的NamingContainer(假如说控件自己具有INamingContainer接口,那么就是自己;否则就是父控件的NaminContainer),然后从这个开始向下在整个容器中查找。但是每当遇到具有 INamingContainer 接口的控件就不再查找其内部了。

GridView具有这个接口
public class GridViewRow : TableRow, IDataItemContainer, INamingContainer
{
具有这个接口,所以你在GridView之外(不管是之上还是同级)的控件上FindControl是找不到它里边的控件的。

同样,由于每一行都有这个接口,所以你在GridView上执行FindControl也找不到每一行内的控件。而每一行中间的每个单元格并没有这个接口
public class TableCell : WebControl
{
所以你在任意一个列上执行FindControl,都可以找到它所在这个行里边其它列里的控件。

#5


谢谢大家
yi_iy
那这个事件改写到哪个事件里面?
Editing?

#6


考察一个asp.net开发人员没有有正规学过asp.net,其实直接问问FindControl机制,看看他会不会正确使用FindControl方法,就能说明不少问题了。

#7


public virtual Control FindControl(
string id
)

类型:System.String
要查找的控件的标识符。
我的DropDownList的ID就是DropdownList1

#8


该回复于2013-03-16 09:48:52被管理员删除

#1


page或gridview的DataBind有没有调用 ?
没做过,建议一下。

#2


DropDownList1_SelectedIndexChanged 的意思是当DropDownListt1控件的改变的时候才出发的事件。

你的这段代码不应该在这个事件里面写。

应该是在Gridview控件加载一个事件里面写。

#3


FindControl方法遇到具有 INamingContainer 接口控件就停止再向里边查找了。如果你要找,你应该直接给出它的 INamingContiner 范围。例如
Gridview1.Rows[3].FindControl("drp")。


要知道,每一行都可能有一个ID是DropDownList1的控件呢!因此页面上至少有很多个DropDownList1呢,不是一个。

#4


看看GRidView的行的定义
public class GridViewRow : TableRow, IDataItemContainer, INamingContainer
{
当你看到它有INamingContainer,就应该知道FindControl代码该如何写。

看看那msdn:  http://msdn.microsoft.com/zh-cn/library/486wc64h.aspx
要注意它写的:在 当前的命名容器中搜索带指定 id 参数的服务器控件。这个命名容器,就是指 NamingContainer。

从一个控件对象上调用FindControl方法的机制,是首先找到这个对象的NamingContainer(假如说控件自己具有INamingContainer接口,那么就是自己;否则就是父控件的NaminContainer),然后从这个开始向下在整个容器中查找。但是每当遇到具有 INamingContainer 接口的控件就不再查找其内部了。

GridView具有这个接口
public class GridViewRow : TableRow, IDataItemContainer, INamingContainer
{
具有这个接口,所以你在GridView之外(不管是之上还是同级)的控件上FindControl是找不到它里边的控件的。

同样,由于每一行都有这个接口,所以你在GridView上执行FindControl也找不到每一行内的控件。而每一行中间的每个单元格并没有这个接口
public class TableCell : WebControl
{
所以你在任意一个列上执行FindControl,都可以找到它所在这个行里边其它列里的控件。

#5


谢谢大家
yi_iy
那这个事件改写到哪个事件里面?
Editing?

#6


考察一个asp.net开发人员没有有正规学过asp.net,其实直接问问FindControl机制,看看他会不会正确使用FindControl方法,就能说明不少问题了。

#7


public virtual Control FindControl(
string id
)

类型:System.String
要查找的控件的标识符。
我的DropDownList的ID就是DropdownList1

#8


该回复于2013-03-16 09:48:52被管理员删除