【问题标题】:In C# how do I access the properties of a derived class from the derived class constructor?在 C# 中,如何从派生类构造函数访问派生类的属性?
【发布时间】:2014-03-16 00:45:51
【问题描述】:

我有一个DataGridView 派生控件,它定义了一些新属性。它们在属性检查器中按预期显示,并输入了连接字符串值,但是当我编译程序时,如果我在 if (ConnectionString == "" ) 行中的构造函数中放置一个中断 - 它显示 ConnectionString 为空,connectionString 确实为空。我意识到我应该在写完这篇文章后测试 null 但关键是该属性中有一个字符串。

目的是将 table 和 connectionString 定义为从中填充它的属性。我做错了什么?

namespace ASControls
{

    public partial class ASDataGridView : DataGridView  
    {

        private string connectionString; 
        // Declares the property.
        [Description("Set the Connection String for the datbase concerned"),
        Category("Data")]
        public string ConnectionString
        {
           get { return connectionString; }
           set {connectionString= value; }
        }

        public ASDataGridView()
        {
        //
        // The InitializeComponent() call is required for Windows Forms designer support.
        //
        InitializeComponent();

        //
        // TODO: Add constructor code after the InitializeComponent() call.
        //

        if (ConnectionString == "" )
        {           
            MessageBox.Show("You must set the connection string in order to use an ASDataGridView control");
            return;
        } else {

            InitData(ConnectionString);
        }

        }
        ...

【问题讨论】:

  • 您可能需要检查属性this.DesignMode.. 因为如果您不允许他们在设置之前使用控件,人们就无法在设计器中设置属性..跨度>
  • 感谢您回来 simon,但我没有按照您的意思理解:目前该属性是在属性检查器中的设计时设置的!
  • 现在我重新考虑一下,我真的完全不明白 DesignMode 的意义所在。为什么程序会处于设计模式?派生的构造函数在表单编译时按预期触发(因此它不在设计模式下)只是属性的值与预期不符 - 我假设我正在查看错误的实例,但我不知道是怎么回事!

标签: c# inheritance datagridview constructor


【解决方案1】:

Simon 所说的事实是,在设计器中,您不能调用您的数据库。解决办法是:

if (IsInDesignMode) // Code runs in Blend --> create design time data.
{
    StatBarTextProp = "IN Design mode";
}
else // Code runs "for real"
{
    StatBarTextProp = /* Get from DB here*/ ;
    
}
    

现在,您的运行时正在愉快地从数据库中获取内容,您的设计将拥有您默认的任何内容。


是的,你可以阅读更多here,但基本上:

DesignerProperties.IsInDesignMode 附加属性

.NET Framework 4.5 其他版本 此主题尚未评级 - 评价此主题 获取或设置 DependencyObject 是否在设计器的上下文中运行。

命名空间:System.ComponentModel

程序集:PresentationFramework(在 PresentationFramework.dll 中) XAML 的 XMLNS:未映射到 xmlns。

【讨论】:

  • 好吧,从您的回复看来,我误解了构造函数的使用。我根本不打算在设计时访问数据库。这个想法是,当表单加载时,派生的 DGV 被实例化,然后使用带有 populate() 的连接字符串来获取数据。我收集然后在设计时调用构造函数,而不是在表单加载后类实例化时调用。
  • 以上内容在构造函数中,想法是在使用 VS 设计器时使用一些数据而不是空白表单。这里应该出现关于框架和好处等的所有常见问题,但是设计器模式的想法是让您可以快速查看假数据。有时,非常有用,有时,并不真正需要
  • IsInDesignMode 是 WPF 的一部分吗?请原谅我明显缺乏启发,但如果没有这一层,我不能从核心控件继承吗?
  • 我不确定我们是否在同一页面上。我没有实现 WPF 应用程序,而是一个类库。我想知道这是否有区别,如果没有,我对添加 PresentationFramework 程序集然后使用类中的 IsInDesignMode 有点迷茫!添加程序集后,我得到“当前上下文中不存在名称'InDesignMode'(CS0103)”。是否需要添加 using 语句?
  • 好的,我明白了......然后看看这个question,它可能更符合您的要求。希望对您有所帮助(如果有请留言,我会将其包含在答案中以供参考)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2018-06-26
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多