Как указать, что я хочу изменить метку в конкретной форме? [Дубликат]

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

Тогда это зависит от какой тип списка вы хотите для вывода, будь то список удаленных кортежей или список кортежей, которые не удалены.

Как указал Дэвид, я рекомендую понимание списка, чтобы сохранить элементы, которые вы не хотите удалять.

somelist = [x for x in somelist if not determine(x)]
28
задан Michel Ayres 8 May 2014 в 15:31
поделиться

14 ответов

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

Я бы предложил последнего. Итак, в вашей форме создайте свойство, которое обертывает свойство Text в управляющем элементе TextBox:

public string FirstName
{
    get { return firstNameTextBox.Text; }
    set { firstNameTextBox.Text = value; }
}

Затем создайте некоторый механизм, через который ваш класс может получить ссылку на форму (например, через contructor). Затем этот класс может использовать свойство для доступа и изменения текста:

class SomeClass
{
    private readonly YourFormClass form;
    public SomeClass(YourFormClass form)
    {
        this.form = form;
    }

    private void SomeMethodDoingStuffWithText()
    {
        string firstName = form.FirstName;
        form.FirstName = "some name";
    }
}

Еще лучше решение будет определять возможные взаимодействия в интерфейсе, и пусть этот интерфейс быть договором между вашей формой и другим классом. Таким образом, класс полностью отделен от формы и может использовать anyting, реализующий интерфейс (который открывает дверь для более легкого тестирования):

interface IYourForm
{
    string FirstName { get; set; }
}

В вашем классе формы:

class YourFormClass : Form, IYourForm
{
    // lots of other code here

    public string FirstName
    {
        get { return firstNameTextBox.Text; }
        set { firstNameTextBox.Text = value; }
    }
}

... и класс:

class SomeClass
{
    private readonly IYourForm form;
    public SomeClass(IYourForm form)
    {
        this.form = form;
    }

    // and so on

}
38
ответ дан Andrei 25 August 2018 в 15:00
поделиться

Я нашел простой способ сделать это, я его протестировал, он работает правильно. Сначала я создал проект Windows, в форме, которую я ввел в TextBox, и я назвал его textBox1, затем я вставил кнопку с именем button1, а затем добавлю класс с именем class1. в классе1 я создал TextBox:

class class1
    {
     public static TextBox txt1=new TextBox();  //a global textbox to interfece with      form1
    public static void Hello()
      {
       txt1.Text="Hello";
      }
    }

Теперь в вашей форме Сделайте это:

public partial class Form1 : Form
    {
     public Form1()
     {
      InitializeComponent();  
     }
     private void button1_Click(object sender, EventArgs e)
      {
       class1.txt1=textBox1;
       class1.Hello();
       }
    }

в button1_Click Я скопировал объект textBox1 в txt1, так что теперь txt1 имеет свойства textBox1 и u могут изменять текст textBox1 в другой форме или классе.

1
ответ дан Arash Mohamadzadeh 25 August 2018 в 15:00
поделиться

Я использовал этот метод для обновления метки, но вы можете легко изменить его на текстовое поле:

Класс:

public Class1
{
    public Form_Class formToOutput;

    public Class1(Form_Class f){
        formToOutput = f;
    }

    // Then call this method and pass whatever string
    private void Write(string s)
    {
        formToOutput.MethodToBeCalledByClass(s);
    }
}

Способы формы, которые будут выполнять обновление:

public Form_Class{

    // Methods that will do the updating
    public void MethodToBeCalledByClass(string messageToSend)
    {
       if (InvokeRequired) { 
           Invoke(new OutputDelegate(UpdateText),messageToSend); 
       }
    }

    public delegate void OutputDelegate(string messageToSend);
    public void UpdateText(string messageToSend)
    {
       label1.Text = messageToSend;
    }
}

Наконец

Просто передайте форму через конструктор:

Class1 c = new Class1(this);
0
ответ дан C. Carter 25 August 2018 в 15:00
поделиться

Я попробовал приведенные выше примеры, но никто не работал, как описано. Однако у меня есть решение, которое сочетается с некоторыми примерами:

public static Form1 gui;
public Form1()
{
    InitializeComponent();
    gui = this;
    comms = new Comms();

}
public Comms()
{
    Form1.gui.tsStatus.Text = "test";
    Form1.gui.addLogLine("Hello from Comms class");
    Form1.gui.bn_connect.Text = "Comms";
}

Это работает, пока вы не используете потоки. Использование потоков потребует большего количества кода и не понадобится для моей задачи.

1
ответ дан Cache Staheli 25 August 2018 в 15:00
поделиться

Вот как я решил это после борьбы за это.

У меня есть глобальный класс, который я могу использовать во всем проекте

 public class GlobalVariables
    {
        public static Form MainFormO;
    }

Я добавил это в основную форму (по умолчанию: Form1)

 public MainFrm()
        {
            InitializeComponent();
            GlobalVariables.MainFormO = this;
        }

И я пишу этот код в классе, я хочу получить доступ к элементу в MainForm. Вы можете просто изменить Listbox на текстовое поле или что угодно.

 GlobalVariables.MainFormO.Invoke((MethodInvoker)delegate
                {
                    ListBox listboxObject= Application.OpenForms["MainFrm"].Controls["listboxid"] as ListBox;
                    Debug.WriteLine(listboxObject.Items.Add("New Line"));
                });
-1
ответ дан İpek 25 August 2018 в 15:00
поделиться
Form1 form = new Form1(); 
form.textBox1.Text = "test";
0
ответ дан Mogsdad 25 August 2018 в 15:00
поделиться

Вы можете изменить модификатор доступа для сгенерированного поля в Form1.Designer.cs с private до public. Измените этот

private System.Windows.Forms.TextBox textBox1;

на этот

public System.Windows.Forms.TextBox textBox1;

Теперь вы можете обработать его, используя ссылку формы Form1.textBox1.

Visual Studio не будет перезапишите это, если вы внесете какие-либо изменения в свойства элемента управления, если только вы не удалите его и не заново создадите.

Вы также можете использовать его в пользовательском интерфейсе, если вы не можете с комфортом редактировать код. Найдите свойство Модификаторы:

6
ответ дан Moslem Ben Dhaou 25 August 2018 в 15:00
поделиться

Я также столкнулся с той же проблемой, когда мне не удалось добавить appextText в richTextBox класса Form. Поэтому я создал метод под названием update, где я использовал сообщение от Class1.

класс: Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _Form1 = this;
        }
        public static Form1 _Form1;

        public void update(string message)
        {
            textBox1.Text = message;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Class1 sample = new Class1();            
        }
    }

класс: Class1.cs

public class Class1
    {        
        public Class1()
        {
            Form1._Form1.update("change text");
        }        
    }
11
ответ дан Praveen 25 August 2018 в 15:00
поделиться

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

0
ответ дан Sai Kalyan Kumar Akshinthala 25 August 2018 в 15:00
поделиться
public partial class Form1 : Form
{

    public static Form1 gui;
    public Form1()
    {
        InitializeComponent();
        gui = this;

    }
    public void WriteLog(string log)
    {
        this.Invoke(new Action(() => { txtbx_test1.Text += log; }));

    }
}
public class SomeAnotherClass
{
    public void Test()
    {
        Form1.gui.WriteLog("1234");
    }
}

Мне нравится это решение.

0
ответ дан santutu 25 August 2018 в 15:00
поделиться

Вам нужно будет иметь некоторый доступ к экземпляру формы для доступа к его коллекции Controls и тем самым изменить текст Text Box's.

. Одним из способов может быть то, что вы можете иметь экземпляр своей формы Доступно как общедоступно или лучше. Создайте новый конструктор для вашей второй формы и получите экземпляр Form1 во время инициализации.

1
ответ дан Shekhar_Pro 25 August 2018 в 15:00
поделиться

Если ваш другой класс наследует Form1, и если ваш textBox1 объявлен открытым, вы можете получить доступ к этому текстовому полю из своего другого класса, просто позвонив:

otherClassInstance.textBox1.Text = "hello world";
0
ответ дан tzup 25 August 2018 в 15:00
поделиться

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

public string SetText
{
  get { return textBox1.Text; }
  set { textBox1.Text = value; }
}
1
ответ дан V4Vendetta 25 August 2018 в 15:00
поделиться

Как насчет

Form1.textBox1.text = "изменить текст";

note: 1. вы должны «включить» Form1 в свой второй исходный файл формы, используя Form1 ;

  1. textBox1 должен быть общедоступным
-1
ответ дан ZeaGate 25 August 2018 в 15:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: