【问题标题】:Call to a Superclass function which alters a component (label)调用改变组件(标签)的超类函数
【发布时间】:2012-11-05 02:11:50
【问题描述】:

如果超类有一个函数 A() 将标签更改为“Hello World”。如何让子类以相同的结果调用 A()?截至目前,我没有收到编译错误,但文本不会改变!

示例代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();            
    }

    private void button1_Click(object sender, EventArgs e)
    {
        FunctionA("Hello");
    }  

    public void FunctionA(string s)
    {
        label1.Text = s;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Test t = new Test();
    }
}

class Test : Form1
{
    public Test()
    {
        FunctionA("World");
    }
}

【问题讨论】:

  • Button2_Click 正在创建一个新的表单实例。您是否希望在与 button2 相同的表单实例中更改标签?
  • 是的,我意识到:/ 是的。我希望子类触发超类的 FunctionA
  • 基类永远不应该知道它的子类。你到底想完成什么?听起来您正在尝试实现访问者模式
  • @RobertSlaney 我在表单 A 上有一个 ListView。还有一个 Update() 函数。我想从另一个班级调用更新。就像我想触发 Update() 运行一样。我可以从子类中调用它,但如果我这样做,程序会崩溃。如果我从 Form A 调用 Update(),它可以工作。它不一定是一个子类..我只是认为这是一个好主意...正在考虑将 Update() 设为静态,但后来我得到了错误

标签: c# winforms class inheritance


【解决方案1】:

Forms 必须有自己的Label 控件才能显示消息。您可能正在使用一个Label 来显示不属于显示Form 的消息。

我不确定要达到什么目的,但您为什么不直接将 Label 控件传递给 FunctionA 以通过这种方式修改消息:

public void FunctionA(ref Label lbl, string s)
{
    lbl.Text = s;
}

添加:您可以这样做:

  1. 首先创建FormA的实例。

    static void Main()
    {
        //...
        FormA frmA = new FormA();
        Application.Run(frmA);
    }
    
  2. 通过在FormB 中为FormA 中的任何操作公开一个参数化构造函数,将FormA 的实例传递给FormB。

    FormB frmB = new FormB(frmA);
    
    //...
    
    public partial class FormB : Form
    {
        public FormB()
        {
            InitializeComponent();
        }
    
        //parameterized constructor
        public FormB(FormA obj)
        {
            FormA = obj;
            InitializeComponent();
        }
    
        public FormA FormA { get; set; }   
    }
    

【讨论】:

  • 嗯,可能是……但我想更改超类的标签……从另一个类(最好是子类?)。我该如何做到这一点?
  • 为什么是参考?按值传递将达到相同的结果。这将允许重新分配标签,而不仅仅是文本。我会强烈避免通过参考传递任何东西。
  • 啊,不错!谢谢!但。这适用于标签。但是,假设 FunctionA 稍微复杂一点……它从 SQL 获取数据并添加到 TreeView。那么,如何调用 FunctionA 而不出现空引用错误?
  • @Half_Baked,为什么怕Null引用异常,有没有可能?
  • @FSX 事情是这样的。我有一个表格 A 的 ListView。还有一个 Update() 函数。我想从另一个班级调用更新。就像我想触发 Update() 运行一样。我可以从子类中调用它,但如果我这样做,程序会崩溃。如果我从 Form A 调用 Update(),它可以工作
【解决方案2】:

在运行主表单之前实例化您的表单。将 form1 引用分配给 form2

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form1 mainForm = new Form1();
        new Form2() { Form1 = mainForm }.Show();
        Application.Run(mainForm);
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public Form1 Form1 { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Form1.Update("World");
    }
}

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Update("Hello");
    }

    public void Update(string text)
    {
        this.label1.Text = text;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2018-03-22
    • 1970-01-01
    • 2013-11-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多