Хобрук: Ваш путь к мастерству в программировании

Как изменить метку из другого класса? С# формирует визуальную студию Windows

Я знаю, что об этом говорится во многих темах, и поверьте мне, я видел их все, но я думаю, что я немного медлительный и не могу понять, как это сделать, так что вот в чем дело! у меня одна форма

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

    }

    private void button4_Click(object sender, EventArgs e)
    {
        adi mYadi= new adi();
        adi.paso(); 
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    public void l8u(string l )
    {
       label8.Text = l; 
    }
}

Предполагается, что метод l8u изменяет текст в label8, поэтому он не может быть статичным, потому что label8 не является статическим (публичным), и у меня есть этот другой класс

public class adi :instrucion
{
    private  int paso;
    private  int registroD;
    private  int registroO; 
    private  int valor;
    private  int vsin; 

    public adi()
    {
        paso = 1;
    }

    public  void setRD(int i){
        registroD = i; 
    }

    public  void setR0(int i)
    {
        registroO = i;
    }
    public void setV(int i)
    {
        valor = i;
    }

    public  int getRD()
    {
        return registroD ;
    }

    public  int getR0()
    {
        return registroO;
    }

    public int getVf()
    {
        return vsin;
    }

    public void paso(){
         //in this method I need change the value of label8
    }  
}

Метод paso отвечает за изменение значения label8, но я просто не могу этого сделать! Я пробовал много разных способов, например, делать что-то вроде

public void paso()
{
    Form1.l8u();
} 

Но это невозможно, так как Form1 - это просто имя класса, а l8u - нет, а статический метод, также попытался установить label8 как общедоступный статический, но Visual Studio это не понравилось, и всякий раз, когда я использовал новый элемент управления в форме VS, измените общедоступный статический только для публики.

Надеюсь, вы можете мне помочь!

27.05.2012

  • Вам нужно передать экземпляр Form1 экземпляру вашего класса adi. Вам также не помешает иметь более высокий процент принятия. 27.05.2012
  • Я понятия не имею, что делает процент принятия ..... 27.05.2012
  • Примите некоторые ответы на некоторые из ваших предыдущих вопросов: stackoverflow.com/faq#howtoask 27.05.2012
  • Вам следует подумать о переводе вашего кода на английский язык в будущих вопросах. 27.05.2012

Ответы:


1

Просто измените свойство модификатора вашей метки на внутреннее или общедоступное, а затем вызовите свою форму и измените текст метки напрямую.

i.e.

Form2 frm = new Form2(); // Form 2 contains label8 and calling in a method (i.e.buttonclick) of form1

if (List<WhoLovesMe>.Count > 0)
{
   frm.Label8.Text = "Someone Loves Me :)";
}
else
{
   frm.Label8.Text = "Noone Loves Me :(";
}
27.05.2012
  • но он создает новую форму и меняет значение Label8 в этой новой форме, верно? Потому что я пробовал это раньше (создать новый экземпляр form1 и изменить значение label8), но он ничего не делает 27.05.2012
  • Нет. Когда вы вызываете в отдельной форме форму, которую вы вызываете, только инициализируется (готова к использованию), если вы устанавливаете ее свойство на внутреннее/защищенное внутреннее или общедоступное. Но если его модификатор устанавливает значение private, то да, новая форма с нуля инициализируется.. и если ваша форма (которую вы хотите изменить, это часть свойства элемента управления) уже отображалась на экране, вам нужно аннулировать ее, чтобы увидеть изменения.. все настройки, основанные на событиях, используют этот метод.. вызывает новый экземпляр формы и установить свойства и показать/подтвердить 27.05.2012
  • Ну, этот способ не работает для меня :( но я только что обнаружил, что нашел небольшой код, который делает трюк: Label lb = (Label) Application.OpenForms["Form1"].Controls.Find("label8", false).FirstOrDefault(); lb.Text = "Form2";) Что вы думаете об этом? Это хорошая идея? 27.05.2012
  • да.. это хорошо для форм, которые уже показаны.. но если вам нужно подумать даже о таком небольшом приросте производительности, вы можете отфильтровать его следующим образом: Application.OpenForms[Form2].Controls.OfType‹Label›().First( x=› x.Name == Label8); если вы используете firstordefault() и запрос не может получить положительный результат, он вызовет исключение, которое вы не можете контролировать, и приложение остановится... но с этим вы можете управлять исключением примерно так: if(lb.Name == null) { MessageBox.Show (нет элемента управления, по которому вы ищете); } 27.05.2012
  • То, что язык позволяет вам что-то делать, не означает, что это очень хорошее решение. Это очень хакерский способ делать то, что он хочет. 27.05.2012
  • @debracey точно, вы правы .. Но, как вы лучше меня знаете, первые правила передовой практики в кодировании, чтобы перейти к более безопасному, быстрому и более простому пути, который дает вам то, что вам нужно, без ошибок .. иногда идти наиболее безопасным способом (четко продвигайтесь вперед по правилам) не может быть лучшим выбором.. тогда это будет похоже на: вы находитесь на шоссе, после которого какое-то шоссе превратится в небольшую каменную дорогу.. если вам нужно добраться до цели -Место и небольшая дорога не повредят вашу машину, тогда вы предпочтете подождать, чтобы закончить строительство шоссе?? или продолжить с небольшой дороги и цели? 27.05.2012
  • @debracey в качестве примера.. сейчас я работаю над проектом, который является моим собственным.. в этом проекте мне нужно немного сложное управление ситуацией.. 8 разных ситуаций в 14 ситуациях, и это в 2 основных ситуациях.. для этого правила гласят: используйте интерфейс, класс, субкласс, атрибуты и проверяйте все ситуации оттуда.. можете ли вы догадаться, если я их сделаю, сколько я потеряю время и стек из ram-pool? для проверки только 1 формы я просто использую 2 коротких значения и контролирую их все в методе.. почти то же самое..это грязно, но я выигрываю от использования оперативной памяти и времени кодирования.. 27.05.2012

  • 2

    Изменение метки таким образом не является хорошей идеей и нарушает некоторые парадигмы программирования. Как правило, базовые классы бизнес-логики не должны напрямую манипулировать пользовательским интерфейсом.

    Форма содержит экземпляр adi. Итак, если не считать передачи экземпляра формы (т.е. this) конструктору adi (или методу paso), вы как бы утонули.

    Лучше использовать какое-то событие, которое adi может запускать, когда ему нужно Form1 для изменения отображения.

    http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

    27.05.2012

    3

    Я знаю, что это было 2 года назад, но не могли бы вы просто сделать это

    public static void function(label l)
      {
        l.Text = "Changed text"
      }
    

    а затем в форме сделать

    private void timer_tick(object sender, EventArgs e)
    {
        function(label);
    }
    
    10.07.2014

    4

    Я тоже ищу ответ, но наконец-то узнал, как изменить метку form1 из другого класса.

    обычно Form1.Designer.cs выглядит так:

                this.label6.AutoSize = true;
            this.label6.Location = new System.Drawing.Point(59, 174);
            this.label6.Name = "label6";
            this.label6.Size = new System.Drawing.Size(72, 13);
            this.label6.TabIndex = 16;
            this.label6.Text = "Output String:";
    

    Form1.Designer.cs должен выглядеть так, чтобы вы могли вызывать его в другом классе:

            label8 = new System.Windows.Forms.Label();
    
                label8.AutoSize = true;
            label8.Location = new System.Drawing.Point(219, 26);
            label8.Name = "label8";
            label8.Size = new System.Drawing.Size(35, 13);
            label8.TabIndex = 25;
            label8.Text = "label8";  
    
             // 
            // Form1
            // 
            this.Controls.Add(label8);
    

    какое-то "это". текст, кроме части «this.Controls.Add» в label8 в Form1.Designer.cs

    И вы должны вызывать его из другого класса следующим образом:

    WindowsFormsApplication999.Form1.label8.Text = "your text here."; //This should modify label8.Text.
    

    редактировать:

    Вы также должны изменить это в Form1.Designer.cs

            private System.Windows.Forms.Label label8;
    

    в это:

            public static System.Windows.Forms.Label label8;
    
    03.01.2018
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..