2011-06-15 54 views
2

基本上我没有使用MasterPage,我只是有一个Default.aspx与几个标签,文本框等项目。我花了几个小时寻找解决方案,我找到了一个,但在我的脑海仍然让我感到困惑,我没有按照自己想要的方式去做。如何从解决方案中的类访问ASP.NET页面上的控件?

我没有麻烦访问它们并从PageLoad设置它们的属性。

但是我做了一个类,就像下面的代码片段一样,它会抛出一个“对象引用未设置为对象的实例”。而我似乎无法弄清楚我缺少的东西。

class Functions 
    { 
     public static void myMethod() 
     { 
      WebForm1 mainForm = new WebForm1(); 
      mainForm.myTextBox.Text = "Something."; 
     } 
    } 

我管理,像这样的事:

class Functions 
    { 
     public static void myMethod() 
     { 
      System.Web.UI.Page myMainForm; 
      myMainForm = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler; 
      TextBox myTextBox = (TextBox)myMainForm.FindControl("myTextBox"); 
     } 
    } 

但它不是只是在做它,它是关于学习我的错我弄不明白了,我希望有一个更简单这样做,考虑到我对ASP.NET很新。通常,当我在WinForms中编写基本应用程序时 - 访问不同表单时没有问题。

而我不喜欢为我试图访问的每个控件执行一个FindControl()。如果有一个简单而有效的解决方法,我很乐意听到它。

预先感谢您。

编辑:我已经把这个例子放在我的项目的旁边,但这是我想要完成的想法。代码片段中可能存在一些小错误,请原谅。

+1

你想完成什么?你这样做都是错误的。 – 2011-06-15 19:05:04

+0

我不明白你要做什么。 – Amy 2011-06-15 19:06:01

+0

我只是试图从一个方法中访问控件,正如我所解释的。整个项目及其想法较大,但与我所要求的无关。 – Synthel 2011-06-15 19:06:29

回答

4

为此使用代码隐藏文件。不要将业务逻辑类与用户界面紧密结合。

如果使用vb,WebForm1.aspx应该有WebForm1.aspx.cs,如果使用c#或WebForm.aspx.vb,那么如果您在WebForm1.aspx上有一个TextBox控件,则应该能够以代码形式访问它,隐藏文件(WebForm1.aspx.cs中或WebForm1.aspx.vb)

public class Validate 
{ 
    public bool IsEmail(string email) 
    { 
     //return false if invalid e-mail or true if valid 
    } 
} 

然后在你的WebForm.aspx.cs,你可以叫

Validate validate = new Validate(); 
bool isValidEmail = validate.IsEmail(txtEmail.Text); 

哪里txtEmail是控制。您可以使Validate类为静态,因此您可以这样做:

bool isvalidEmail = Validate.IsEmail(txtEmail.Text); 
+0

这正是我所要求的,我无法访问它,那些代码片段从我的代码隐藏,这是在Default.aspx.cs 我可以访问文本框或标签只有当我写在“Page_Load “ 部分。如果我在其中创建一个类和一个方法,并且键入例如textBox1.Text,它将不会将其识别为现有的控件。 – Synthel 2011-06-15 19:18:14

+0

@Synthel,你就像其他人说的那样错了。分开你的顾虑。将bll或dal类保留在代码隐藏文件之外。 – Xaisoft 2011-06-15 19:23:22

+0

@Xaisoft因此,将它们作为单独项目添加到解决方案中,是您建议的而不是将它们放在Page_Load下面? – Synthel 2011-06-15 19:25:40

1

像这样传递或访问控件是非常错误的。相反,通过方法参数将需要的数据发送给该方法,或者在调用方法之前用必要的数据(例如:control.Text或其他)来初始化函数类。你也在这里做的是典型的函数式编程,没有任何OOP代码。试着找到一本关于面向对象的好书,并先阅读它,它会让你的一切变得更加容易。

+0

谢谢你的建议,我会进一步阅读。但我相信我已经解释了非常错误的东西,所有人都误解了我。 – Synthel 2011-06-15 19:20:43

2

由asp.net系统处理时,页面上的控件被创建。它们不会通过调用页面类的构造函数来创建。这意味着你不能做你最初尝试的东西 - 非控件将在那里。第二个版本(FindControl)正常工作是因为您正在使用由asp.net正确创建的页面,方法是访问HttpContext.Current.Handler。

正如其他人指出的,它看起来像你试图做错了一些事情。既然你说你是新来的asp.net,也许这里有人可以提供一些指导,如果你会解释你需要完成什么(在功能上,而不是在技术上)

我还应该指出,即使您使用简单的构造函数调用成功创建页面,它也会成为页面的新实例,而不是您的用户发布给您的那个实例。

+0

很高兴知道它为什么起作用,但学习并不好,我完全错了我的做法。如果我试图解释整个概念,我可能会让更多人失望。 – Synthel 2011-06-15 19:33:34

2

你应该做的是在设计器或后面的代码中声明你的控件。说,myTextBox是你声明的文本框。如果你想修改该文本框的文本应该创建像这样

public string MyTextBoxText 
{ 
    get 
    { 
     return MyTextBox.Text; 
    } 
    set 
    { 
     MyTextBox.Text = value; 
    } 
} 

很抱歉的格式属性,......我一直试图CTRL + K + d,但它不工作)。

然后您应该访问属性并通过属性操作它们。正如其他人所说的,它会帮助你知道你为什么试图从其他类中修改它,或者你试图去做什么。如果你想通过例如主持人来修改文本框,这个属性将被暴露并且可以被操纵,同时屏蔽你不想被改变的属性被暴露(如果你暴露整个属性,情况就不是这样控制)

+0

谢谢你的提示,我现在就试试,看看它是如何发展的。还要感谢对于初学者不友好的待遇,不像其他人。 – Synthel 2011-06-15 19:24:47

+0

我有一个问题,这是一个很好的做法。我的意思是,如果我试图取得类似的结果,我应该更愿意通过所需的财产,而不是通过整个控制? – Synthel 2011-06-15 19:53:37

+0

是的,除非有特定原因需要整个控件,否则应该只公开需要修改的属性(通常每个控件只有一个,例如.Text,.Checked等) – 2011-06-15 20:53:33

1

因为有时你只需要一个答案,需要现在,试试这个:

class Functions 
{ 
    public static void myMethod() 
    { 
     WebForm1 myMainForm; 
     myMainForm = (WebForm1)System.Web.HttpContext.Current.Handler; 
     TextBox myTextBox = myMainForm.myTextBox; 
    } 
} 

诀窍是处理程序转换为网页的类型,而不是到基Page类。这样做可以在不使用FindControl的情况下强有力地访问页面。由于这个Functions类无法访问页面上的受保护属性,因此您还需要使用公共属性公开他们的数据,正如Mike M.所建议的。

+0

谢谢凯文,我会试试这个,如果我不知道如何正确地做。现在我有点担心,我在逻辑上做错了,试图找出正确的方式来做到这一点,而不是错误地学习。 – Synthel 2011-06-15 19:30:29

+0

再次感谢Kevin,你和Mike以及Xisoft一直非常有用,但我不知道如何一次投票给你们所有人。 :) – Synthel 2011-06-15 19:44:56

0

您需要从您的方法中删除STATIC关键字。然后你将能够直接引用控件。 :)