ASP.NET 4.0:是否可以在不使用FindControl或公共属性的情况下将某些用户控件的子控件公开?

时间:2011-11-22 15:27:55

标签: asp.net user-controls controls public

我有一个自定义用户控件,其中包含文本框,下拉列表等。我需要将这些控件公开,以便我可以从控件外部查看ucEmployeeAddress.txtAddr1.Text

我知道我可以在控件中使用公共属性来返回控件内部的实例,或者使用FindControl从用户控件外部找到我的控件,但是由于代码过多,我不想这样做。 / p>

如果没有办法做我想做的事情,那么我将去公共财产路线。

编辑:翻译我的问题的人是否会如此善良地解释我的问题显示缺乏研究工作,不清楚或无用?

4 个答案:

答案 0 :(得分:1)

你真的需要公开整个控件吗?

如果只是文本属性,你可以公开它。

public string TitleText
{
     get { return this.txtTitle.Text;}
}

如果你真的需要控制我会建议通过一个属性暴露它,消费者可能甚至不知道控件的存在或名称,他们也不应该关心你的内部工作 - 使用FindControl是一个穷人来自控制之外的解决方案。

public TextBox TitleTextBox
{
     get { return this.txtTitle;}
}

作为替代方案,您可以修改visual studio模板以将所有控件公开为公开,但我不确定这是否是一个好主意或如何做到这一点..

答案 1 :(得分:1)

您只需要在用户控件中公开一个属性:

public string Address
{
    get
    {
        return txtAddr1.Text;
    }
    set
    {
        txtAddr1.Text = value;
    }
}

答案 2 :(得分:1)

好吧,大约三个小时后,我终于找到了解决方案。我不知道这是VS2010中的新功能,但您实际上可以编辑用户控件的设计器并将所有成员从Protected转为Public。我发誓我过去曾尝试使用早期版本的VS而没有成功,但它现在显然对我有用。

有趣的是,IDE非常敏锐地意识到应该和不应该重新设计设计器的哪些部分。例如,如果注释掉设计器类的全部内容,则不会重新生成已注释掉的成员。要让它重新生成它们,您必须完全删除要重新生成的成员。同样很酷的是,您可以注释掉整个设计器类的内容,切换回标记并添加像文本框一样的服务器控件,然后翻转回设计器,发现它只生成了该控件的成员定义,而其余的则成员参考文献仍然被注释掉了。 修改:如果您从标记中删除了一个控件,该控件的设计者成员已经从protected修改为public,它仍会从设计器中删除该引用。

我会注意到我也在使用VB.NET。我不得不假设它适用于C#,但不能肯定地说。

答案 3 :(得分:0)

这样做的正确方法是通过事件冒泡。这样,您可以隐藏控件的实现,同时可以修改您选择的属性。

This link很好地解释了如何实现这一目标。

作为旁注,您应该更关注代码的优雅而不是它的数量。

例如,如果您花时间实现事件冒泡,而不是将控件的子项公开为public,那么控件的子项的任何操作都由该控件处理。这使得操作变得容易维护,并且易于在整个应用程序中实现。

但是,如果您将控件的子项公开为public,则必须在使用它的任何地方重复该操作。

因此,“多余代码”既可以提高代码质量,又可以减少您关心的“多余代码”。