C # доступ к свойствам управления из статического пустоты - PullRequest
0 голосов
/ 27 февраля 2009

У меня есть форма с кнопкой и флажок. если я нажимаю кнопку, вызывается static void, который вызывает не статический void, который показывает окно сообщения с checkbox.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 ]

1 голос
/ 27 февраля 2009

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

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

1 голос
/ 27 февраля 2009

Полагаю, вы, вероятно, пришли из фона 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();
}
0 голосов
/ 27 февраля 2009

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

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();
  }
}
0 голосов
/ 27 февраля 2009

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

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

0 голосов
/ 27 февраля 2009

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

    private void button1_Click(object sender, EventArgs e)
    {
        y(); // not x();
    }
0 голосов
/ 27 февраля 2009

Попробуйте

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

}
0 голосов
/ 27 февраля 2009

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

0 голосов
/ 27 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...