为什么 e.findcontrol 返回空值



我正在尝试在行数据绑定的 gridiview 模板字段中找到服务器控件,但它返回 null。为什么?

我正在尝试找到一个

具有 runat 属性的控件,但它返回 null。

实际上,我正在尝试在此控件中加载HTML文本。

protected void gvBidDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var paraAgreement = e.Row.FindControl("paraAgreement") as Literal;
paraAgreement.Text = "sahdbaskjdbasjbdjabsdbhasdbhasjbhdab<br/>sdbasdbhasdjabjdbasjdbjasbhdashhhdbasdbhab<br/>shdbhashbdashbdashdabshdbhasdbjabsdabsdbhasbhdashdbasd";
}
}
catch (Exception ex)
{
Utility.Msg_Error(Master, ex.Message);
}
}

。.aspx

<asp:TemplateField HeaderText='Finalized ?'>
<ItemTemplate>
<asp:LinkButton ID="btnFinalizedRecord" OnClick="btnFinalizedRecord_Click" runat="server" Text='<%# Convert.ToBoolean(Eval("IsFinalized")) == true? "": "Finalize" %>'
CssClass="" ToolTip="Finalize" CommandName="Finalize"
CommandArgument='<%#Eval("IsFinalized")%>' Enabled='<%# Convert.ToBoolean(Eval("IsFinalized")) == true? false: true %>'></asp:LinkButton>
<ajax:confirmbuttonextender id="ConfirmButtonExtender1" runat="server" displaymodalpopupid="mpe2" targetcontrolid="btnFinalizedRecord">
</ajax:confirmbuttonextender>
<ajax:modalpopupextender id="mpe2" runat="server" popupcontrolid="pnlPopup2" targetcontrolid="btnFinalizedRecord" okcontrolid="btnYes"
cancelcontrolid="btnNo" backgroundcssclass="modalBackground">
</ajax:modalpopupextender>
<asp:Panel ID="pnlPopup2" runat="server" CssClass="modalPopup" Style="display: none">
<div class="header">
Are you sure to <b>Finalize</b>? 
</div>
<div class="body">
<asp:CheckBox ID="chkConfirmFinalize" runat="server" />
<%--<a href="TermsAndConditions.aspx" target="_blank">Agree with the Terms and Conditions</a>--%>
<p runat="server" id="paraAgreement">
</p>
</div>
<div class="Popupfooter" align="right">
<asp:Button ID="btnYes" Enabled="false" CssClass="btn btn-sm btn-danger btnYes" runat="server" Text="Yes" />
<asp:Button ID="btnNo" CssClass="btn btn-sm btn-primary" runat="server" Text="No" />
</div>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>

编辑 1:

您正在尝试将结果转换为FindControlLiteral并且由于 HTML 段落服务器控件被识别为System.Web.UI.HtmlControls.HtmlGenericControl并且as关键字被静默吞噬InvalidCastException下面,因此它返回 null:

无法强制转换类型的对象 "System.Web.UI.HtmlControls.HtmlGenericControl"键入 'System.Web.UI.WebControls.Literal'.

因此,FindControl赋值应如以下示例:

protected void gvBidDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var paraAgreement = e.Row.FindControl("paraAgreement") as HtmlGenericControl;
paraAgreement.InnerText = "[sample text]";
}
}
catch (Exception ex)
{
Utility.Msg_Error(Master, ex.Message);
}
}

按控件 ID 查找嵌套子控件的另一种方法是使用自定义方法在整个父控件中执行递归搜索(归功于 @Win):

// taken from /a/15708885/6378815
public static Control FindControlRecursive(Control parentControl, string id)
{
if (parentControl.ID == id) 
{
return parentControl;
}
return parentControl.Controls.Cast<Control>().Select(c => FindControlRecursive(c, id)).FirstOrDefault(c => c != null);
}
// GridView event method
protected void gvBindDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
var paraAgreement = new HtmlGenericControl();
foreach (Control control in gvBindDetails.Rows)
{
paraAgreement = FindControlRecursive(control, "paraAgreement") as HtmlGenericControl;
}
paraAgreement.InnerText = "[sample text]";
}
}
catch (Exception ex)
{
Utility.Msg_Error(Master, ex.Message);
}
}

附加参考:

System.Web.UI.HtmlControls.HtmlGenericControl (MSDN)

相关问题:

查找嵌套在中继器控件中的控件

在ASP.NET 中找到控制权的更好方法

您正在使用FindControl搜索Literal。但paraAgreement不是实际的asp:Literal控制。所以它总是返回null.

请改用HtmlGenericControl

HtmlGenericControl p = e.Row.FindControl("paraAgreement") as HtmlGenericControl;
p.InnerHtml = "Found the Control";

最新更新