【问题标题】:ASP.NET expose controls to other classASP.NET 向其他类公开控件
【发布时间】:2012-11-27 21:00:48
【问题描述】:

我已经为此奋斗了一段时间,我需要一些指导。

我正在使用 ASP.NET 4.0 WEBFORMS 进行编码。

问题是:如何将文本框、标签或任何其他控件公开给另一个类。

我有一个网络表单(见下文)。

public partial class WebForm1 : System.Web.UI.Page
{

}

然后引用它并将其发送到另一个类。

public class SearchInitializer
{
    private WebForm1 _webform1;

    public SearchInitializer(WebForm1 Webform1)
    {
        _webform1 = Webform1;
    }

    public void ChewSettings()
    {

        _webform1 //can't find any control in here?!
    }

}

首先我想创建一个公共属性,我认为我可以从我发送给新类的引用中访问它。但是不!

public partial class WebForm1 : System.Web.UI.Page
{
   public string KeywordBox1 
    {
        get {return txt_keyword.Text;}
        set {txt_keyword.Text = value;}
    }

}

我试图将 Webform 继承到其他类。使该财产可用,但那里没有运气。

public class SearchInitializer : Webform1
{
    private WebForm1 _webform1;

    public SearchInitializer(WebForm1 Webform1)
    {
        _webform1 = Webform1;
    }

    public void ChewSettings()
    {

        _webform1 //can't find any control in here?!
    }

}

好的,抽象类在这里可能有用,继承一切。但我想我错了。我有事件和静态类,所以它们可以与页面对话。但我真的不想使用静态类作为容器来保存我的控件中的所有信息。 所以这些是我尝试过的例子,但都失败了。所以这基本上是我试图扩展我所知道的;)感谢阅读! 为什么他们失败了,我应该怎么做?

按要求编辑!

public partial class WebForm1 : System.Web.UI.Page
{

     protected void btn_click(object sender, EventArgs e)
     {
         SearchInitializer searchIni = new SearchInitializer(this);
     }

}

【问题讨论】:

  • 你为什么要这样做?我看不出有任何理由这样做......
  • 你的财产方法是正确的,为什么 但是不! ?但最有可能的是你在错误的时刻调用它。添加更多上下文。
  • 展示你如何创建和使用SearchInitializer
  • Intellisense 根本不显示该属性?当我写 _webform1.我无法访问该属性..?!我应该尝试 findcontrol 并这样做吗?制作公共财产有点失败.. ?!
  • @Igor 完成阅读我的最新问题

标签: c# asp.net


【解决方案1】:

要公开控件,我能想到的有两种方法可供您使用。

您可以从myPage.designer.cs 文件中删除以下语句,并将其作为公共声明放在您的代码后面:

protected global::System.Web.UI.WebControls.TextBox myTextBox;

变成

public System.Web.UI.WebControls.TextBox myTextBox;

这应该可以立即访问。我的首选方法是为您要提供访问权限的每个特定控件添加一个属性。

public System.Web.UI.WebControls.TextBox MyTextBoxElement
{
    get
    {
        return myTextBox;
    }
}

如果您需要它们或其他条件,这允许提供补充访问控制。在任何情况下,要访问字段或属性,消费对象必须通过您的特定页面类型引用它。

【讨论】:

  • 您能解释一下“在您的示例中,以下代码失败,因为this 的类型为System.Web.UI.Page 而不是WebForm1 类型。”当然这总是当前对象的类型,即Webform1...
  • @Chris:不。当然不能。我可以给你一些借口来解释为什么我的大脑会这么想,但没有什么合理的:)
【解决方案2】:

不确定您要做什么,但要访问继承的 cals 中的 base 类,您需要使用 base 关键字,而不是在那里声明实例。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public string KeywordBox1
    {
        get { return txt_keyword.Text; }
        set { txt_keyword.Text = value; }
    }
}

public class SearchInitializer : WebForm1
{
    public SearchInitializer()
    {
    }

    public void ChewSettings()
    {
        // Works
        base.KeywordBox1 = "Red";
    }
}

如果智能感知未显示该属性,请尝试重建解决方案。然后它会刷新可用属性列表并且应该会显示出来。

【讨论】:

  • 我试过的属性仍然没有显示在 Intellisense 中。但是谢谢.. ;)
  • @CarlPalsson 请参阅已更新。如果基类的属性是公共的,则子类始终可以使用这些属性。您的智能感知可能没有按预期重建。尝试重建解决方案。
【解决方案3】:

您的原始方法必须有效。我建议您创建一个带有文本框和SearchInitializer 类的表单的小型测试项目,然后看看它是否有效,然后找出您当前项目中的不同之处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-06-15
    • 2010-10-19
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多