C# 从gridview中强制转换下拉列表

C# 从gridview中强制转换下拉列表,c#,asp.net,gridview,casting,C#,Asp.net,Gridview,Casting,我正在尝试使用findcontrol方法动态填充下拉列表。我不断得到一个空引用,并尝试了几种不同的方法。这是我试过的一些代码 <ItemTemplate> <asp:DropDownList runat="server" ID="ddlCalculateGrid" Style="border: none; border-width: 0px; width: 90%" OnSelectedIndexCha

我正在尝试使用findcontrol方法动态填充下拉列表。我不断得到一个空引用,并尝试了几种不同的方法。这是我试过的一些代码

<ItemTemplate>
   <asp:DropDownList runat="server" 
           ID="ddlCalculateGrid" 
           Style="border: none; border-width: 0px; width: 90%"
           OnSelectedIndexChanged="ddlCalculateGrid_OnSelectedIndexChanged"
           AutoPostBack="true">
   </asp:DropDownList>
   <asp:HiddenField runat="server" 
           ID="hdnCalculate" 
           Value='<%# Eval("Calculate") %>' />
</ItemTemplate>

由于这是在项目模板中,最简单的方法是在dropdownlist本身上使用处理程序:

<asp:DropDownList runat="server" ID="ddlCalculateGrid" 
    Style="border: none; border-width: 0px;width: 90%"
    OnSelectedIndexChanged="ddlCalculateGrid_OnSelectedIndexChanged"
    OnLoad="ddlCalculateGrid_OnLoad"
    AutoPostBack="true">

由于这是在项目模板中,最简单的方法是在dropdownlist本身上使用处理程序:

<asp:DropDownList runat="server" ID="ddlCalculateGrid" 
    Style="border: none; border-width: 0px;width: 90%"
    OnSelectedIndexChanged="ddlCalculateGrid_OnSelectedIndexChanged"
    OnLoad="ddlCalculateGrid_OnLoad"
    AutoPostBack="true">

由于这是gridview中的一行,因此此dropdownlist可能有许多实例。您必须在gridview中的每一行中循环

foreach (GridViewRow tt in GridView1.Rows)
        {
            if (tt.RowType == DataControlRowType.DataRow)
            {                    
              tt.FindControl("ddlCalculateGrid");
            }
        }

由于这是gridview中的一行,因此此dropdownlist可能有许多实例。您必须在gridview中的每一行中循环

foreach (GridViewRow tt in GridView1.Rows)
        {
            if (tt.RowType == DataControlRowType.DataRow)
            {                    
              tt.FindControl("ddlCalculateGrid");
            }
        }

您的下拉列表位于项目模板中。这意味着您的gridview可能包含多个下拉列表(每行一个),或者如果gridview绑定到没有行的源,则根本不包含下拉列表

如果希望为每一行绑定每个下拉列表,可以在GridViewRowDatabound事件中这样做

protected void Page_Load(object sender, EventArgs e)
{
    grvbillDetail.RowDataBound += grvbillDetail_RowDataBound;
}

void grvbillDetail_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;
    var ddl = e.Row.FindControl("ddlCalculateGrid") as DropDownList;
    if (ddl != null)
    {
        ddl.DataSource = rcta.GetDataByTrueValue();
        ddl.DataBind();
    }
}
}

您的下拉列表位于项目模板中。这意味着您的gridview可能包含多个下拉列表(每行一个),或者如果gridview绑定到没有行的源,则根本不包含下拉列表

如果希望为每一行绑定每个下拉列表,可以在GridViewRowDatabound事件中这样做

protected void Page_Load(object sender, EventArgs e)
{
    grvbillDetail.RowDataBound += grvbillDetail_RowDataBound;
}

void grvbillDetail_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;
    var ddl = e.Row.FindControl("ddlCalculateGrid") as DropDownList;
    if (ddl != null)
    {
        ddl.DataSource = rcta.GetDataByTrueValue();
        ddl.DataBind();
    }
}
}

在GridView顶部是否有其他控件。我的意思是这是一个嵌套的gridview吗?这个后端代码到底在哪里?在某个gridview事件处理程序上?还要注意,GridView模板中定义的控件并不直接属于GridView;它们属于
GridViewRow
。因此,您可能希望循环遍历
grvbillDetail.Rows
,然后尝试对每一行执行
FindControl()
。您是否验证了FindControl()返回了一些内容?什么是rcta?您确定它不为空吗?在GridView顶部有其他控件吗。我的意思是这是一个嵌套的gridview吗?这个后端代码到底在哪里?在某个gridview事件处理程序上?还要注意,GridView模板中定义的控件并不直接属于GridView;它们属于
GridViewRow
。因此,您可能希望循环遍历
grvbillDetail.Rows
,然后尝试对每一行执行
FindControl()
。您是否验证了FindControl()返回了一些内容?什么是rcta?您确定它不为空吗?