Сразу же вы хотите создать копию списка, чтобы вы могли иметь это как ссылку, когда вы повторяете и удаляете кортежи в этом списке, которые соответствуют определенным критериям.
Тогда это зависит от какой тип списка вы хотите для вывода, будь то список удаленных кортежей или список кортежей, которые не удалены.
Как указал Дэвид, я рекомендую понимание списка, чтобы сохранить элементы, которые вы не хотите удалять.
somelist = [x for x in somelist if not determine(x)]
Я бы рекомендовал, чтобы вы этого не сделали. Вы действительно хотите иметь класс, который зависит от того, как редактирование текста реализовано в форме, или вы хотите механизм, позволяющий получить и установить текст ?
Я бы предложил последнего. Итак, в вашей форме создайте свойство, которое обертывает свойство 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
}
Я нашел простой способ сделать это, я его протестировал, он работает правильно. Сначала я создал проект 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 в другой форме или классе.
Я использовал этот метод для обновления метки, но вы можете легко изменить его на текстовое поле:
Класс:
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);
Я попробовал приведенные выше примеры, но никто не работал, как описано. Однако у меня есть решение, которое сочетается с некоторыми примерами:
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";
}
Это работает, пока вы не используете потоки. Использование потоков потребует большего количества кода и не понадобится для моей задачи.
Вот как я решил это после борьбы за это.
У меня есть глобальный класс, который я могу использовать во всем проекте
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"));
});
Form1 form = new Form1();
form.textBox1.Text = "test";
Вы можете изменить модификатор доступа для сгенерированного поля в Form1.Designer.cs
с private
до public
. Измените этот
private System.Windows.Forms.TextBox textBox1;
на этот
public System.Windows.Forms.TextBox textBox1;
Теперь вы можете обработать его, используя ссылку формы Form1.textBox1
.
Visual Studio не будет перезапишите это, если вы внесете какие-либо изменения в свойства элемента управления, если только вы не удалите его и не заново создадите.
Вы также можете использовать его в пользовательском интерфейсе, если вы не можете с комфортом редактировать код. Найдите свойство Модификаторы:
Я также столкнулся с той же проблемой, когда мне не удалось добавить 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");
}
}
Используйте глобальную переменную или свойство для назначения значения в текстовое поле, укажите значение для переменной в другом классе и назначьте ее textbox.text в классе формы.
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");
}
}
Мне нравится это решение.
Вам нужно будет иметь некоторый доступ к экземпляру формы для доступа к его коллекции Controls
и тем самым изменить текст Text Box's
.
. Одним из способов может быть то, что вы можете иметь экземпляр своей формы Доступно как общедоступно или лучше. Создайте новый конструктор для вашей второй формы и получите экземпляр Form1 во время инициализации.
Если ваш другой класс наследует Form1, и если ваш textBox1 объявлен открытым, вы можете получить доступ к этому текстовому полю из своего другого класса, просто позвонив:
otherClassInstance.textBox1.Text = "hello world";
Определите свойство формы, например, затем используйте его в других местах, где оно будет доступно с экземпляром формы
public string SetText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
Как насчет
Form1.textBox1.text = "изменить текст";
note: 1. вы должны «включить» Form1 в свой второй исходный файл формы, используя Form1 ;