【问题标题】:ASPX - FindControl(string) finding control but not its valueASPX - FindControl(string) 查找控件但不查找其值
【发布时间】:2017-06-16 18:32:17
【问题描述】:

我的 ASPX 页面出现问题。根据列表框中的选择,网站(动态)生成适当的控件。

稍后在ButtonClick 事件中,我需要获取几个文本框的文本值。这就是问题所在,我的代码可以识别具有相应属性(如 ID)的文本框,但 不是它们的 Text 值。

这是我使用的代码:

//This is part of the company framework and is merely to provide context. 
Dal.Customer newCus = new Dal.Customer();

//It recognizes the textboxes, but doesn't find the text inside it. (there is text in the textboxes)
TextBox txtCusName = (TextBox)Page.FindControl("ctl00$ContentPlaceHolder1$txtCusName");
TextBox txtCusCode = (TextBox)Page.FindControl("ctl00$ContentPlaceHolder1$txtCusCode");

newCus.DisplayName = txtCusName.Text;
newCus.CustomerCode = txtCusCode.Text;

我想知道我在这里做错了什么以及我缺少哪些步骤,或者是否有另一种(更好的)方法来获得我需要的东西。

提前致谢。

编辑

根据请求,在从列表框中进行选择后,这里是在页面上“生成”(或者更好地称为“写入”)适当控件的代码。

private void CreateCustomerTemplate(Control control)
    {
        PlaceHolder ph = new PlaceHolder();

        TextBox txtCusName = new TextBox();
        TextBox txtCusCode = new TextBox();

        txtCusName.ClientIDMode = ClientIDMode.Static;
        txtCusCode.ClientIDMode = ClientIDMode.Static;

        txtCusName.ID = "txtCusName";
        txtCusCode.ID = "txtCusCode";
        ph.Controls.Add(new LiteralControl("<table><tr><td>" +
                "Customer Name: </td><td>"));
        ph.Controls.Add(txtCusName);
        ph.Controls.Add(new LiteralControl("</td></tr><tr><td>" +
                "Customer Code: </td><td>"));
        ph.Controls.Add(txtCusCode);
        ph.Controls.Add(new LiteralControl("</td></tr>"));

        ph.Controls.Add(new LiteralControl("</table>"));

        control.Controls.Add(ph);

    }

这里是选择 ListBox 并最终调用创建适当控件的代码。这发生在SelectedIndexChanged-事件中(使用AutoPostBack=true)。

switch (ddlType.SelectedItem.Value)
        {
            case "null":
                btnSend.Visible = false;
                break;

            case "Customer":
                new Template(TemplateType.Customer, spantempcontent);
                btnSend.Visible = true;
                templateType = TemplateType.Customer;
                break; 
                //The switch goes on
         }

【问题讨论】:

  • 试试txtCusName.Value.ToString()
  • “找不到里面的文字” 表示txtCusName.Text 返回""?我怀疑您重新创建文本框为时已晚。在Page_Init做吧
  • txtCusName.Value 在这里不可用,因为文本框是一个 ASPX 控件。如果它是一个 HTML 控件,这将起作用。但是感谢您的尝试。 @AshishSrivastava
  • 没错,它返回"",它返回一个空字符串,而控件内有明显的文本。 @TimSchmelter
  • @TimSchmelter 在这里最有可能走在正确的轨道上。如果控件是动态添加的,则需要在HttpApplication.AcquireRequestState 事件触发之前在回发中重新添加。这意味着它们应该在(例如)Page_Init 事件中创建...为了在此处提供帮助,我们需要了解您如何添加和重新添加这些控件。

标签: c# asp.net dynamic


【解决方案1】:

您试图通过在 HTML 中通过控件的 ID 来查找元素,而您应该使用 asp.net ID。

所以改变

TextBox txtCusName = (TextBox)Page.FindControl("ctl00$ContentPlaceHolder1$txtCusName");

进入

TextBox txtCusName = (TextBox)Page.FindControl("txtCusName");

asp.net将Placeholders内Controls的ID、数据重复Controls(GridView、Repeater)改成这个ctl00$ContentPlaceHolder1$txtCusName,保证客户端不会有重复的ID。

更新

您总是需要递归地找到控件。因此,如果您使用母版页,您需要先找到 ContentPlaceHolder。

ContentPlaceHolder cph = Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
TextBox tb = cph.FindControl("txtCusName") as TextBox;

TextBox是否像Panel一样位于另一个Control中,那么需要先找到Panel再找到TextBox。

ContentPlaceHolder cph = Master.FindControl("ContentPlaceHolder1") as ContentPlaceHolder;
Panel p = cph.FindControl("Panel1") as Panel;
TextBox tb1 = p.FindControl("txtCusName") as TextBox;

【讨论】:

  • 使用ID是我尝试的第一件事。但如果我使用 ID,整个事情都会返回 null
  • 您想在哪里找到控件?从母版页还是 aspx 页面?
  • 我正在尝试查找我的 aspx 页面本身中的控件。起初我在&lt;span&gt; 中拥有它。但我遇到了同样的问题。当我使用跨度时,我有spanId.FindControl("txtCusName");
  • 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多