【问题标题】:Setting nested control values in a asp:formview from C# code behind在 asp:formview 中设置嵌套控件值从 C# 代码后面
【发布时间】:2016-09-03 02:21:55
【问题描述】:

我是从控制 asp:SqlDataSource 的角度来处理这个问题的取而代之的是 formview 内的控制级别,因为它对我来说似乎更有意义。

所以对于背景 下面的代码旨在注入下面屏幕剪辑的前两行中列出的字符串值(以及包含的代码块底部的两个相应的 Response.Write's)。

我想要做的是使用 FindControl 来设置这些项目的 Text 值(但在完成此操作后我还有一些 asp:checkbox 需要处理,这需要同样的处理。)现在我只关注这两个控件。第一个是asp:label

<asp:Label runat="server" ID="SubmitByLbl" Text='<%# Eval("SubmitBy") %>'  ></asp:Label>

接下来是一个asp:TextBox:

<asp:TextBox Text='<%# Bind("SubmitDT") %>' runat="server" ID="SubmitDTTextBox" />

这两个都位于 asp:FormView 内部,其 ID="AddItemFv" 具有 DataSourceID="AddInvAsset"(与本次讨论无关,但仅作为补充信息提供)。

这是我的问题所在的代码:

namespace CInTrac
{
public partial class AddAsset : System.Web.UI.Page
{
    protected void Page_Preload(object sender,EventArgs e)
    {

        AddInvAsset.SelectParameters.Add("SubmitBy", Session["RegUser"].ToString());
        AddInvAsset.SelectParameters.Add("SubmitDT", DateTime.Now.ToString("MM/dd/yyyy"));
    }
    protected void Page_Load(object sender, EventArgs e)
    {

        Label uname = (Label)AddItemFv.Row.FindControl("SubmitBy");
        if (uname != null)
            uname.Text = Session["RegUser"].ToString();

        TextBox udate = (TextBox)AddItemFv.Row.FindControl("SubmitDT");
        if (udate != null)
            udate.Text = DateTime.Now.ToString();

        Response.Write("<b>Submitted by should be:</b> = " + Session["RegUser"].ToString() + "<br>");
        Response.Write("<b>Submit Date should be:</b> = " + DateTime.Now.ToString("MM/dd/yyyy") + "<br>");
    }

}

}

我遇到的问题正是您在上面的示例中看到的;绝对没有!我是 C# 的新手,所以我可能在这里的代码有问题,在调试时我的跟踪表明,当我们检查 null 时,它无法为每个 VAR 的 .Text 赋值,因此我们的值永远不会出现。

更新: 正如 IM 指出的那样,我错过了代码中控件的正确名称。以下是我对上面代码所做的更正,效果很好。再次感谢 Inquisitive_mind 指出我的错误。 :

        protected void Page_Load(object sender, EventArgs e)
    {
        Label uname = (Label)AddItemFv.Row.FindControl("SubmitByLbl");
        if (uname != null)
            uname.Text = Session["RegUser"].ToString();

        TextBox udate = (TextBox)AddItemFv.Row.FindControl("SubmitDTTextBox");
        if (udate != null)
            udate.Text = DateTime.Now.ToString("MM/dd/yyyy");
    }

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    控件的ID不正确

    改变

    Label uname = (Label)AddItemFv.Row.FindControl("SubmitBy");
    TextBox udate = (TextBox)AddItemFv.Row.FindControl("SubmitDT");
    

    Label uname = (Label)AddItemFv.Row.FindControl("SubmitByLbl");
    TextBox udate = (TextBox)AddItemFv.Row.FindControl("SubmitDTTextBox");
    

    编辑

    您必须将 FindControl 移动到 FormView 事件。只有在 FormView 完全创建并绑定数据后才能访问这些控件。尝试将代码从 page_load 移动到 YourFormView_Databound 事件。

    protected void YourFormView_DataBound(Object sender, EventArgs e)
    {
        Label uname = (Label)AddItemFv.Row.FindControl("SubmitByLbl");
            if (uname != null)
                uname.Text = Session["RegUser"].ToString();
    
            TextBox udate = (TextBox)AddItemFv.Row.FindControl("SubmitDTTextBox");
            if (udate != null)
                udate.Text = DateTime.Now.ToString();
    }
    

    【讨论】:

    • 好吧,你在控件的名称上抓住了我,但这不是问题,因为问题仍然是它在 null 之后为每个这些步骤将字符串分配给 VAR.Text检查.. 但是非常感谢您发现可能会出现问题的控件名称。
    • @KenCarter 我已经编辑了答案。试试 DataBound 事件中的代码。
    • 嗯嗯嗯你知道'乌鸦'今天特别好!我最初对代码的“预加载”部分中的行进行了编辑,现在已经消失了!因为它不是必需的。当我意识到我做了什么时,我更改了正确的代码,运行了调试,并且空检查允许分配值,哇!它工作正常!谢谢即时消息!对不起我厚厚的头骨!
    猜你喜欢
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多