Проблема С# при попытке добавить элементы в поле со списком через другую форму

avatar
AleMaffe
8 августа 2021 в 19:46
81
1
-2

У меня такая ситуация: в моей форме Order есть поле со списком со многими продуктами внутри. ожидается, что пользователь может добавлять продукты в поле со списком для использования в Order, но это делается с помощью другой формы, называемой ProductAdd, в основном созданной с помощью текстового поля, где пользователь вводит название продукта, и оно добавляется с помощью кнопка. Поскольку у меня нет доступа к полю со списком в форме Order, когда я нахожусь в форме ProductAdd, я создал метод в Order, который добавляет в поле со списком переданный продукт.

Строка не добавляется в поле со списком в другой форме.

Это метод для работы в поле со списком

public void addProductInCbb(string newProduct)
  {
      cbbProdotti.Items.Add(newProduct);
  }

Это метод в другой форме ProductAdd для добавления строки в мой cbb

private void btnConfirmNewProduct_Click(object sender, EventArgs e)
        {   
            Order o = new Order(new Form1()); //that's because I think I need an instance of Order to call the method... is that correct?
            String newProduct= txtNewProduct.Text; //get product string from txt

            //boring checks to say if product already exists
            bool found = false;
            ArrayList products= o.getProducts();

            foreach(String product in products)
            {
                if (product.Equals(newProduct)) found = true;
            }
            if (!found)
            {
                o.addProductInCbb(newProduct); //method call from Order
                MessageBox.Show("Success!","", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }  
            else MessageBox.Show("Product already exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                
        }

-РЕДАКТИРОВАТЬ- Я сделал странный конструктор «Order o = new Order(new Form1())», потому что: для вызова addProductInCbb(string) мне нужен экземпляр Order, НО, в свою очередь, конструктору Order нужен параметр Form1, потому что, когда Order завершен , создается PDF-файл со всеми данными как из form1, так и из формы заказа... Может ли это вызвать мою проблему?

Источник
user12031933
8 августа 2021 в 19:47
0

Для этого в Top 5 повторяющихся вопросов вы можете использовать, по вашему мнению: одноэлементные формы, статические элементы данных, события, шаблон статического метода запуска, конструктор с параметрами и т. д.

AleMaffe
8 августа 2021 в 19:53
0

@OlivierRogier Но на самом деле я сделал метод addProductInCbb(newProduct), который представляет собой своего рода «набор» или что-то в этом роде. Почему тогда не работает?

user12031933
8 августа 2021 в 19:58
0

Лично я создаю все свои формы с одним экземпляром как синглтоны. И когда мне нужно несколько экземпляров форм, я использую технологии, упомянутые в двух экземплярах, в зависимости от ситуации. Что касается вашего кода, я нашел его странным, и мне трудно понять, что вы пытаетесь сделать. Вам нужно изучить обычные модели и выбрать ту, которая лучше всего соответствует вашим потребностям: в основном, статический метод запуска или передача ссылки на текущую форму или желаемый элемент управления или элемент данных во вновь созданный один конструктор, или подписка на событие последний. Использование синглетонов делает взаимодействие чистым, если это уместно.

AleMaffe
8 августа 2021 в 20:04
0

@OlivierRogier да, на самом деле, new Order(new Form1()) не убедил меня с самого начала ... но я сделал это, потому что: для вызова addProductInCbb(string) мне нужен экземпляр Order, НО, в свою очередь, конструктор Order нуждался в Form1, потому что, когда заказ выполнен, создается PDF-файл со всеми данными как из формы 1, так и из формы заказа...

jdweng
8 августа 2021 в 20:19
1

Вам нужен экземпляр формы и вы не можете закрыть форму. См. мой проект с двумя формами: coderhelper.com/questions/34975508/…

AleMaffe
9 августа 2021 в 11:54
0

Я создаю новый объект... Где я не прав?? Я не могу понять, все ваши примеры в основном сделаны с использованием gets, но для того, чтобы использовать Gets, вам нужен экземпляр, и я создал его.. так что еще?

Ответы (1)

avatar
Caius Jard
8 августа 2021 в 21:11
1

Вот ряд шагов, которые нужно выполнить, чтобы научиться, не нарушая существующий код:

  • Создать новый проект winforms
  • Убедитесь, что он имеет 2 формы (form1, form2)
  • На первую форму поместите поле со списком (comboBox1) и кнопку (button1)
  • На второй форме поместите два текстовых поля (textBox1, textbox2) и кнопку (button1)
  • В конструкторе формы1 после IinitializeComponent введите:

    var dt = new DataTable();
    dt.Columns.Add("disp");
    dt.Columns.Add("val");
    dt.Rows.Add("first", "1");
    dt.Rows.Add("second", "2");

    comboBox1.DisplayMember = "disp";
    comboBox1.ValueMember = "disp";
    comboBox1.DataSource = dt;

    new Form2(dt).Show();

  • Дважды щелкните кнопку в форме 1 и введите код в обработчик событий. Это просто для демонстрации чего-то другого, не нужного для передачи данных между формами:
    MessageBox.Show(comboBox1.SelectedValue.ToString());
  • Измените конструктор Form2, чтобы он принимал параметр DataTable; сохраните параметр в переменной уровня класса
    private DataTable _dt;

    public Form2(DataTable dt){
      _dt = dt;
    }

  • Дважды щелкните кнопку form2 и введите код обработчика:
    _dt.Rows.Add(textBox1.Text, textBox2.Text);
  • Запустите приложение. Вы заметите, что все, что вы пишете в tb1 и tb2 на form2, добавляется к комбо, когда вы нажимаете кнопку. Нажатие кнопки на форме 1 показывает, например. «1», когда в комбо выбрано «первое». Таким образом вы показываете пользователю какое-то красивое строковое значение, но за ним скрывается какое-то другое значение, например, идентификатор int
  • .

Происходит следующее: form2 добавляет данные в общую таблицу данных, о которой известно как форме2, так и форме1 (комбо использует таблицу данных в качестве источника данных). При добавлении строк механизм привязки гарантирует, что элемент управления с привязкой к данным будет уведомлен, и он обновится сам.

Это не обязательно должны быть таблицы данных, это могут быть любые данные, содержащие класс, который вы используете совместно, но таблицы данных довольно удобны для привязки данных в приложениях Windows Forms

AleMaffe
7 ноября 2021 в 14:07
0

ЭТО ТОЧКА: КАК я могу использовать объекты, которые видны как для Form1, так и для Form2, без повторного создания экземпляра Form2 в Form1?? Итак, почему ваш DataTable виден Form1 и Form2 ?? Как это возможно?

Caius Jard
7 ноября 2021 в 17:38
1

Form1 создала таблицу данных и передала ее в form2 при ее создании: new Form2(dt).Show(); — конструктор формы2 захватил ее (см. пункт, начинающийся с Изменить конструктор формы2) и спрятал ее в переменной уровня класса, но это тот же самый datatable, к которому имеет доступ form1 - 2 ссылки на один и тот же объект в памяти

Caius Jard
7 ноября 2021 в 17:39
1

без повторного создания экземпляра Form2 в Form1? хорошо.. Form1 имеет доступ к Form2, так что вы можете даже сделать какой-то общедоступный метод на form2, который принимает datatable и хранит его, тогда это может стать как form1 делится данными с form2

AleMaffe
8 ноября 2021 в 18:56
0

Хорошо, я думаю, я понимаю... Итак, в основном, чтобы сделать некоторые объекты видимыми для другой формы, я должен передать их в конструкторе другого, когда я его создаю... но это единственный способ? Я пробовал, и это работает, но... Если мне нужно передать 50 объектов, я должен использовать 50 параметров в конструкторе? Разве это не немного странно? Нет ли более технологичного автоматического метода «написать один раз и запустить где угодно»?

Caius Jard
8 ноября 2021 в 18:58
1

Я могу ответить на это, только если увижу, как вы это сделали в данный момент. Я совершенно уверен, что Если мне нужно передать 50 объектов, я должен использовать 50 параметров в конструкторе, хотя это немного ошибочно; мы всегда можем пройти только одну вещь, чтобы достичь того, чего мы хотим

AleMaffe
8 ноября 2021 в 19:02
0

ага да например массив вместо 50 TextBox например это ты имеешь в виду? Но давайте предположим, что у меня есть 50 различных типов объектов в моей Form1, и я хочу сделать их видимыми и редактируемыми в Form2 или, что еще хуже, во ВСЕХ формах решения... Как я могу это сделать?

Caius Jard
8 ноября 2021 в 19:05
1

Эм... Вы, вероятно, инкапсулировали бы их в UserControl, который вы могли бы поместить куда угодно, т.е. написать свой собственный элемент управления, который представляет собой композицию из 50 текстовых полей и т. д.

AleMaffe
8 ноября 2021 в 19:09
0

Я сделаю это. Теперь я знаю, как им пользоваться. Странно, что профессора не учат этому в школе, в основном это главное, что нужно знать для работы на C#, иначе это не будет объектно-ориентированный язык. Большое спасибо!

Caius Jard
8 ноября 2021 в 19:10
1

Я думаю, вполне возможно, что этому обучали, просто не в той форме, которую вы бы сразу узнали. Пользовательский элемент управления на самом деле не что иное, как любой другой класс, например, Person представляет собой набор строк (имя, адрес, ssn), целые числа (возраст, рост, вес) и т. д.