【问题标题】:e.Row.findcontrol() returns null after databind but all databound fields work properlye.Row.findcontrol() 数据绑定后返回 null 但所有数据绑定字段正常工作
【发布时间】:2012-07-19 22:20:55
【问题描述】:

我正在尝试获取一个 gridview 来填充从数据库调用到我的标签的文本,如图所示 结果已经过测试并返回正确的名称

protected void Page_Load(object sender, EventArgs e)
{
    DataTable t = DBProductLink.ListWithOptions(ProductId, LinkType, null);
    TestList.DataSource = t ;
    TestList.DataBind();
}

标签是这样在 Gridview 中创建的:

<asp:GridView ID="TestList" runat="server" OnRowDataBound="testDataBound" AutoGenerateColumns="false" DataKeyNames="Id">
    <Columns>
        <asp:TemplateField HeaderText="Sizes">
            <asp:ItemTemplate>
                <asp:Label ID="sizeLabel" runat="server" Text='<%# Eval("size") %>' />
            </asp:ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

然后我尝试遍历 gridview 并使用 ondatarowbound 访问标签,但是在此它为空。

protected void testDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;

    Label sizeLabel = e.Row.FindControl("sizeLabel") as Label;
    sizeLabel.Text = "test";
}

我使用完全相同的设置,在另一个网格视图上使用 2 个下拉框和 2 个标签,在同一页面上使用不同的名称,但没有此问题。有人对此有想法吗? 另一个Gridview如下:

<asp:GridView ID="SearchList" runat="server" AutoGenerateColumns="False"
    DataKeyNames="Id"  OnRowDataBound="SearchList_RowDataBound"
    OnRowCommand="SearchList_RowCommand" Width="100%"  PageSize="20" >
    <Columns>
        <asp:BoundField DataField="Code" HeaderText="Code" SortExpression="Code" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField HeaderText="Price" SortExpression="Price">
            <ItemTemplate>
                <robo:MoneyLabel ID="MoneyLabel2" runat="server" 
                    Value='<%# Eval("Price") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Type">
            <ItemTemplate>
                <asp:Label ID="typeLabel" runat="server" Text='<%# Eval("Type") %>' />
                <asp:HiddenField ID="productId" runat="server" Value='<%# Eval("Id") %>' />
                <asp:HiddenField ID="isFabric" runat="server" Value='<%# Eval("IsFabric") %>' />
                <asp:HiddenField ID="isOldWizard" runat="server" Value='<%# Eval("IsOldWizard") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Options/Color/Size">
            <ItemTemplate>
                <asp:LinkButton runat="server" ID="GetOptions" Text="Get Options" CausesValidation="false" CommandName="Options"  />
                <asp:Label ID="OptionLabel" Visible="false" runat="server" Text="Option: " />
                <asp:DropDownList ID="ProductOptions" runat="server" Visible="false" />
                <asp:Label ID="ColorLabel" Visible="false" runat="server" Text="Color: "  />
                <asp:DropDownList  ID="RibbonColors" runat="server" Visible="false" AutoPostBack="true" />&nbsp;&nbsp;&nbsp;&nbsp;
                <asp:Label ID="SizeLabel" Visible="false" runat="server" Text="Size: " />
                <asp:DropDownList ID="RibbonSizes" runat="server" Visible="false" AutoPostBack="true"  />
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Add">
            <ItemStyle Width="60px" />
            <ItemTemplate>
                <asp:LinkButton ID="LinkButton1" runat="server" Text="Add" CommandName="Add" CommandArgument='<%# Eval("Id") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

.cs 是

protected void SearchList_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
        return;
    int productId = (int)SearchList.DataKeys[e.Row.RowIndex].Value;
    LinkButton GetOptions = e.Row.FindControl("GetOptions") as LinkButton;
    DropDownList RibbonColors = e.Row.FindControl("RibbonColors") as DropDownList;
    DropDownList  RibbonSizes = e.Row.FindControl("RibbonSizes") as DropDownList;
    DropDownList ProductOptions = e.Row.FindControl("ProductOptions") as DropDownList;
    Label typeLabel = e.Row.FindControl("typeLabel") as Label;
    HiddenField isFabric = e.Row.FindControl("isFabric") as HiddenField;
    HiddenField isOldWizard = e.Row.FindControl("isOldWizard") as HiddenField;

    ProductType typeValue = DBConvert.ToEnum<ProductType>(typeLabel.Text);
    bool isFabricValue = Convert.ToBoolean(isFabric.Value.ToString());
    bool isOldWizardValue = Convert.ToBoolean(isOldWizard.Value.ToString());       
}

【问题讨论】:

  • 该事件被称为RowDataBound 而不是datarowbound,除此之外,您还没有在GridView 上声明事件处理程序。旁注:您不应在每次回发时在 page_load 中对 GridView 进行数据绑定(启用 ViewState 时,默认值)。相反,您应该只这样做if(!IsPostBack)
  • @Tim 谢谢蒂姆,我已经对此进行了一系列尝试,并多次尝试了不同的方法,例如使用 onrowdatabound 以及直接执行 TestList.DataBind();和 OnRowDataBound="测试数据绑定”。我将编辑帖子以正确显示事件处理程序还有其他想法吗?
  • 您能粘贴其他正常工作的网格视图的标记吗?
  • @Andre 我已经为你发布了另一个 gridview,你可以告诉我我正在使用一个测试 gridview 来解决我遇到的错误问题。
  • 我找不到你的代码有什么问题,它应该可以工作,从我的脑海中,你确定你没有为多个GridView使用同一个处理程序???跨度>

标签: c# asp.net gridview web-controls


【解决方案1】:

我刚刚发现问题

你的标记是错误的,这很棘手......我承认它

这个标签:&lt;asp:ItemTemplate&gt;应该是&lt;ItemTemplate&gt;

改变这个:

<asp:TemplateField HeaderText="Sizes">
    <asp:ItemTemplate>
         <asp:Label ID="sizeLabel" runat="server" Text='<%# Eval("size") %>' />
    </asp:ItemTemplate>
</asp:TemplateField>

进入

<asp:TemplateField HeaderText="Sizes">
    <ItemTemplate>
         <asp:Label ID="sizeLabel" runat="server" Text='<%# Eval("size") %>' />
    </ItemTemplate>
</asp:TemplateField>

这应该引发异常...但是,ItemTemplate 被完全忽略了

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2015-09-28
  • 2013-04-03
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多