C# доступ к свойствам управления из static void

У меня есть форма с кнопкой и флажком. если я нажимаю кнопку, вызывается static void, который вызывает нестатическое void, которое показывает окно сообщения с флажком .checked.toString () Проблема в том, что если я изменяю значение флажка, он всегда показывает false

Код есть

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();
        }



    }
}

Ответов (8)

Решение

Пытаться

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);
    }

}

Это потому, что вы создаете экземпляр новой формы Form1 внутри x (), попробуйте передать 'this' методу x в качестве параметра.

ваши проблемы связаны с методом x (), то, что вы там делаете, на самом деле создает совершенно новую форму и устанавливает флажок для этих форм, который, очевидно, будет инстанциироваться как false. Вместо вызова x () вы должны вызвать y ().

Или, в качестве альтернативы, поместите messagebox.show в сам метод buttonclick.

checkbox1 В y() на совершенно другой Form1 - тот , который вы создали в x . Просто избавьтесь от них, x() и все должно работать:

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

Метод x создает новую форму. Флажок в новой форме также будет новым (созданным с помощью формы) и будет иметь значение по умолчанию false.

Что именно ты пытаешься сделать? Зачем создавать новую форму при нажатии кнопки? Если вы действительно хотите это сделать, вам нужно установить состояние флажка новой формы после вызова Form f = new Form1 ();

Вы создаете новый экземпляр Form1. Зачем ты это делаешь? Когда вы создаете новую форму, также создается новый флажок. Флажок в форме выглядит так, как будто по умолчанию установлен на false (не отмечен), поэтому каждый раз, когда вы создаете новый экземпляр формы, он появляется как false.

Думаю, вы, вероятно, пришли из 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, не так ли? Но если это не так, то удаление static из x() может быть лучшим решением.

void x()
{
    this.y();

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

Если вам нужно получить доступ к некоторому экземпляру формы из статического метода, вам нужно где-то сохранить ссылку на эту форму.

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();
  }
}