【问题标题】:Designtime scope in winformswinforms中的设计时范围
【发布时间】:2015-07-13 13:25:58
【问题描述】:

我有一个关于如何在 winforms 应用程序中设置组件以便它们可以相互交互的问题。但我想使用视觉设计器进行设置。

我有一个名为 myDataBase 的组件和一个名为 myDataTable 的组件。
现在组件 myDataTable 具有 myDataBase 类型的属性。 所以在代码中我可以做

myDataBase db = new myDataBase();
myDataTable dt = new myDataTable();
dt.DataBase = db;

组件myDataTable中的DataBase属性是公开的,所以我也可以使用可视化设计器来分配DataBase属性。

现在解决我的问题。 我有很多表单,上面有一个或多个 myDataTable 组件。
我只想要一个 myDataBase 实例。

我现在要做的是在主窗体上创建一个组件 myDataBase dbMain = new myDataBase()。
在每个表单上,我都必须将所有 myDataTable 组件的属性设置为此 dbMain。
我必须在代码中执行此操作,因为可视化设计器在主窗体上看不到 dbMain 组件。

所以问题是,我可以创建一个组件 myDataBase 的实例,它在所有表单上对可视化设计器都是可见的,这样我就可以使用可视化设计器来设置 myDataTable 组件的属性吗?

对于那些现在使用 Delphi 的人,我想要 Delphi 中的 DataModule 之类的东西。

【问题讨论】:

    标签: c# winforms custom-component visualdesigner


    【解决方案1】:

    你不能没有一些代码。

    就我而言,您可以做的最简单的事情是创建一个从Form 派生的基本表单,并在该表单中创建一个指向数据库对象的单例实例的属性。您可以绑定到该属性,但仍然尽可能简单。

    您只需让 您的 表单从这个表单派生:

    public class DatasourceForm : Form
    {
        public myDataBase DataBase
        {
            get
            {
                return myDataBaseFactory.Current;
            }
        }
    }
    

    以及负责创建单例数据库实例的工厂:

    public class myDataBaseFactory
    {
        private static readonly Lazy<myDataBase> lazy =
        new Lazy<myDataBase>(() => new myDataBase());
    
        public static myDataBase Current { get { return lazy.Value; } }
    }
    

    (来自here 的单例实现)

    【讨论】:

    • 就个人而言,我更喜欢Lazy&lt;T&gt; 来创建单例;-)
    • @UweKeim: 好的 :) 实际上我也是。
    • 我所有的表单都是基本表单的后代,因此我可以轻松实现这一点。但是视觉设计者能看到继承表单上的属性 myDataBase 吗?
    • 我刚试过这个,问题仍然是继承表单上的视觉设计器看不到这个属性,所以我仍然必须在代码中做所有事情。
    • @GuidoG:您可以添加一个指向thisBindingSource 实例。通过这种方式,您可以绑定到属性。不确定是否可以将其添加到基本表单中。
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多