【问题标题】:C# accessing control propertes from static voidC# 从静态 void 访问控制属性
【发布时间】:2009-02-27 15:05:31
【问题描述】:

我有带有按钮和复选框的表单。如果我点击按钮静态 void 调用它调用非静态 void 显示带有 checkbox.checked.toString() 的消息框 问题是如果我更改复选框值,它总是显示错误

代码是

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

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

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        public void y()
        {
            MessageBox.Show(checkBox1.Checked.ToString());
        }

        static void x()
        {
            Form1 f = new Form1();
            f.y();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            x();
        }



    }
}

【问题讨论】:

    标签: c# static


    【解决方案1】:

    方法 x 实例化一个新表单。新表单上的复选框也将是新的(随表单创建),默认值为 false。

    你到底想做什么?为什么在按下按钮时创建一个新表单?如果您真的想这样做,那么您需要在调用 Form f = new Form1(); 后设置新表单的复选框状态

    【讨论】:

      【解决方案2】:

      我猜你可能和我一样有 Visual Basic 背景。

      在 C# 中,表单只是 Form 类的实例,它们不像 VB6 时代那样具有特殊地位。

      当您调用new Form1() 时,您基本上是在创建一个 表单 访问相同的表单。因为任何表单都可以有多个实例,因为它实际上只是一个 C# 类。

      您可以通过让 x() 方法将当前形式作为参数来解决此问题

      static void x(Form1 theForm)
      {
          theForm.y();
      }
      
      private void button1_Click(object sender, EventArgs e)
      {
          x(this);
      }
      

      表单类中的 this 参数指向表单实例本身。

      您现在应该在创建表单时获得正确的值而不是默认值。

      我想你需要x() 成为static,不是吗?但如果不是这样,从x() 中删除static 可能是更好的解决方案。

      void x()
      {
          this.y();
      
          // or you can just omit the this qualifier and call just y();
      }
      

      【讨论】:

      • 当然,如果他这样做的话,x还不如是一个静态方法,这样他就不用传入form对象了。
      【解决方案3】:

      试试

      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
          }
      
          private void Form1_Load(object sender, EventArgs e)
          {
      
          }
      
          public void y()
          {
              MessageBox.Show(checkBox1.Checked.ToString());
          }
      
          static void x(Form f)
          {
              f.y();
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              x(this);
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        这是因为你在 x() 中实例化了一个新的 Form1,尝试将 'this' 作为参数传递给 x 方法。

        【讨论】:

        • 仅来自编译器 pov。不是来自建筑视角。
        【解决方案5】:

        您正在创建一个新的 Form1 实例。你为什么这样做?创建新表单时,也会创建一个新复选框。表单上的复选框看起来默认设置为 false(未选中),因此,每次创建表单的新实例时,它都会显示为 false。

        【讨论】:

          【解决方案6】:

          y() 中的checkbox1 位于完全不同的Form1 上——即您在x 中创建的那个。只需摆脱x(),它应该可以工作:

              private void button1_Click(object sender, EventArgs e)
              {
                  y(); // not x();
              }
          

          【讨论】:

            【解决方案7】:

            您的问题出在 x() 方法中,您在那里所做的实际上是制作一个全新的表单并检查该表单复选框,这显然会被实例化为 false。 与其调用 x(),不如调用 y()。

            或者,或者,将 messagebox.show 放在 buttonclick 方法本身中。

            【讨论】:

              【解决方案8】:

              如果您需要从静态方法访问某个表单实例,您需要在某处保存对该表单的引用。

              class Program
              {
                public static Form thatForm;
              
                public static void Main(string[] args)
                {
                  MyForm form = new MyForm();
                  thatForm = form;
                  Application.Run(form);
                }
              }
              
              class MyForm : Form
              {
                void Foo()
                {
                  Program.thatForm.somethingPublic();
                }
              }
              

              【讨论】:

                猜你喜欢
                • 2013-02-13
                • 2018-04-18
                • 2016-12-31
                • 1970-01-01
                • 2016-12-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多