我是usercontrols的新手,到目前为止只创建了一个,所以请耐心等待。我今天一直在阅读用户控件应该是自包含的,而不是依赖父容器中的任何信息。我得到了那个部分,但我理解的是那种围绕这个原则设计我的程序的“正确”方法。
我在C#中创建一个Web表单,其中有一个页面在该页面中有一个usercontrol。我在其ascx文件中创建了usercontrol并将其拖入我的aspx页面。 usercontrol是几个日期框和gridview,用于显示SQL存储过程的结果。
我真的很想重复使用这个控件,但我无法弄清楚如何“告诉”用户控件我想要为我所在的特定页面运行哪些存储过程而不违反“don” t依赖于父容器“规则。
由于
答案 0 :(得分:6)
不依赖父容器并不意味着你无法沟通。在父级将设置的用户控件中公开属性。但是有一个默认值,所以它不会崩溃。
另外,如果这是一个非常具体的控制,那么依靠父母是没有理由的。它可能不太理想,但您将使用用户控件来提供代码分离。
答案 1 :(得分:2)
您的控件无需知道数据的来源。它不需要知道存储过程或其他任何东西。它需要知道的是它需要显示的数据。如果我理解你的控制权,它就是一个带有一些日期过滤器的网格。它将接收数据,显示数据并按日期过滤。这很好,它需要知道的是它需要显示的数据,也许是父母的默认开始和结束日期。
答案 2 :(得分:2)
如果您不允许用户控件与父母进行通信,那么您就错过了用户控件的真正威力。我认为在这种情况下你可能会对封装有点过分。
假设您有一个用户控件,它只是一个表或各种用户数据的gridview。用户控件不可避免地需要知道用户的唯一标识符,以便从任何地方提取数据,这当然会迫使您创建父页面可以设置的公共属性。
另外,请记住,有时用户控件中的操作需要在父级上触发操作。活动代表在这里发挥作用,它们非常有用,在我看来,使用户控件更有用。
放弃关于用户控件和父母不要来回交谈的整个想法,你会发现事情变得更容易。
答案 3 :(得分:0)
因此,您在此用户控件中有一些内容将数据绑定到存储过程返回的数据集?
这是处理它的一种方法: 而不是尝试将存储过程传递给用户控件,而是创建用户控件将依赖于用户控件的公共属性的数据集。
在运行时,用户控件之外的代码将运行相应的存储过程,并将用户控件上的dataset属性设置为存储过程返回的结果。
答案 4 :(得分:0)
正如其他人所指出的那样,您的用户控制需要有一种标准的方式来传达其意图和行为。这并不意味着您必须引用容器,因此知道(MyPage.aspx)实际包含它。
我在使用用户控件时发现不可或缺的是事件。了解事件以及如何使用它们。事件是沟通行为的好方法。
在您的示例中,我可能会将您的条件(日期文本框)拆分为自己的用户控件。创建一个继承自EventArgs的新类,该类包含您的条件(DateTime
字段)。当用户点击搜索时,使用您的自定义EventHandler<YourEventArgs>
触发事件(类型为EventArgs
)。该页面将处理事件,查询数据库,然后将结果传递到第二个用户控件上的公共或内部方法,该控件将显示记录。
此处的密钥,如果您需要调用不同的存储过程,则可以在不同的页面上重用您的条件控件。考虑插入与更新方案。通常,UI元素是相同的。您可以创建一个控件并在具有两种不同行为的两个不同页面上使用它(AddRecord.aspx和UpdateRecord.aspx)。此外,显示记录的控件很容易重复使用。
一个巨大的好处是您的页面和控件变得相当小。每个控件/页面实际上只关注其小部分功能。您的代码将变得不那么令人生畏,也更容易维护。
答案 5 :(得分:0)
“告诉”用户控制我想要运行的存储过程
听起来你正在寻找活动/代表 让控件公开一个事件,让父母添加一个处理程序(如果你想强制它添加一个且只有一个事件,可能在构造函数中) 或者,您可以使用命令/策略模式 - 让父封装方法,并将封装对象发送到其构造函数中的控件。