C# 项目不';不存在于当前环境中

C# 项目不';不存在于当前环境中,c#,asp.net,C#,Asp.net,我想知道为什么在我的代码隐藏中,有时我必须使用特殊的技巧才能让它看到我的.aspx webform中的元素,而有时我却看不到。 例如: DropDownList clrslct = (DropDownList)FindControl("ColorSelector"); clrslct.SelectedValue = Request.Cookies["BackgroundColor"].Value; 有时我必须编写它,以便我的代码在其关联的.aspx文件中看到标记。其他时候,我可以在代码中简单地

我想知道为什么在我的代码隐藏中,有时我必须使用特殊的技巧才能让它看到我的.aspx webform中的元素,而有时我却看不到。 例如:

DropDownList clrslct = (DropDownList)FindControl("ColorSelector");
clrslct.SelectedValue = Request.Cookies["BackgroundColor"].Value;
有时我必须编写它,以便我的代码在其关联的.aspx文件中看到标记。其他时候,我可以在代码中简单地调用标记的ID,这样就可以了。有人知道这是为什么吗

完整代码(从)为:


您必须在网格视图行事件或重复控件项创建事件中使用FindControl——因为没有一个控件,所以有零个或多个控件具有相似的名称/id

这些控件位于中,这是在其模板中查找它们的基础。如果您正在创建一个web应用程序,则会创建一个designer.cs文件并对您可见(它也是为web站点创建的,但仅在编译时创建),其中的任何内容都可以从codebehind类中访问


因此,简单的回答是:在命名容器中,您必须使用FindControl或类似工具来查找它,在命名容器之外,它可以直接寻址。

如果我希望代码保留在我的代码中,我现在似乎必须坚持使用FindControl。 我最终使用了:

System.Web.UI.HtmlControls.HtmlControl bdyBodyTag = (System.Web.UI.HtmlControls.HtmlControl)FindControl("BodyTag");

感谢所有建议。

是否在回发期间,在页面预呈现时,您还没有绑定下拉列表?当您试图在列表中查找值时,下拉列表还没有绑定?i、 我认为你所指的“特殊技巧”是在页面周期的不同状态下访问下拉列表。你不是在某个地方有一个aspx.designer.cs文件,或者你是用代码创建控件的吗?如果页面中没有名为ColorSelector的成员,则无法引用它。我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。简单地说,aspx web表单会丢失一个名为Designer.cs的文件,其中包含有关当前页面上所有控件的信息。这就是为什么需要使用FindControl方法。但是到目前为止,我还没有完全理解你的问题。我只是测试了一些东西,因为我从来没有真正验证过这一点。但是如果你使用designer视图并在其上放置控件,你会在该成员的designer文件中获得条目。我从工具箱中取出一个dropdowlist并将其放入一个DIV中。我在designer文件中得到了一个很好的条目。标签也是一样的,好吧。在aspx文件中键入相同的控件-->无!看起来你是说,如果我的C#代码被包装在.aspx文件中的标记周围,我就可以直接访问它们。但是如果我想让代码在代码后面呢?我的理解是,这将使代码成为服务器端(我想要的),而不是客户端。@Laserbeak43:不,您的所有代码(除了任何javascript)都只是服务器端。不同之处在于,一些控件在设计时不存在,因为它们位于运行时在服务器上创建的结构中。这些控件不能以与设计时存在的控件相同的方式引用——编译器/intellisense不知道它们,因为它们还不存在。@Laserbeak43:基本上你应该看到ColorSelector控件。要么你的代码有问题,要么Visual Studio中有一个bug——我看到VS在识别新控件时通常会出现延迟。我只是忽略了它,但有时我已经退出并重新打开了解决方案。看起来Schwarzie2478发现了问题,designer.cs没有检测到元素何时写入表单(至少不是立即)。但它们是在从工具箱中拖动时创建的。感谢您消除了服务器端代码和客户端代码之间的差异。@Laserbeak43:根据我的经验,在大多数情况下,它几乎是可以立即识别的(手动输入时)。如果没有,告诉它先构建通常可以解决问题。我认为其中有一些bug,因为我肯定看到它在没有重新打开解决方案的情况下无法识别新控件(即使它可能识别随后输入的控件)。从未尝试使用设计器添加控件,以查看这是否会使它认识到事情已经发生了变化。重新打开解决方案也从未失败过,但这是一种痛苦。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;`enter code here`
using System.Web.UI;
using System.Web.UI.WebControls;

namespace cookiesSessionsViewStates
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.Cookies["BackgroundColor"] != null)
            {
                DropDownList clrslct = (DropDownList)FindControl("ColorSelector");
                clrslct.SelectedValue = Request.Cookies["BackgroundColor"].Value;
                BodyTag.Style["background-color"] = clrslct.SelectedValue;
            }
        }

        protected void ColorSelector_IndexChanged(object sender, EventArgs e)
        {
            BodyTag.Style["background-color"] = ColorSelector.SelectedValue;
            HttpCookie cookie = new HttpCookie("BackgroundColor");
            cookie.Value = ColorSelector.SelectedValue;
            cookie.Expires = DateTime.Now.AddHours(1);
            Response.SetCookie(cookie);
        }
    }
}
System.Web.UI.HtmlControls.HtmlControl bdyBodyTag = (System.Web.UI.HtmlControls.HtmlControl)FindControl("BodyTag");