gokhan572 Ответов: 2

C# как передать данные multi select datagridview в одно текстовое поле в другой форме?


У меня есть вопрос по C# Winforms следующим образом: как передать данные multi select datagridview (иметь один столбец) в одно текстовое поле в другой форме? Любое предложение будет оценено по достоинству. Спасибо.

ProductView-это мой класс, а pv-это список, который показан на рисунке ниже. Когда я нажимаю кнопку Добавить в список, все названия продуктов хранятся в datagridview в виде списка. Затем я хочу, чтобы данные в этом списке передавались в другое текстовое поле.

https://i.stack.imgur.com/LwHrD.png

Надеюсь, это понятно.

Что я уже пробовал:

private void btnAddtoTextBox_Click(object sender, EventArgs e)
 {
     NewForm nf = new NewForm();

 List<ProductView> pv = new List<ProductView>();

     foreach (var item in pv)
     {
         if (pv != null)
         {
             nf.txtMyTextBox.Text = string.Join(",", pv.Select(c => c.ProductName.ToString()).ToArray());
         }

     }
 }

2 Ответов

Рейтинг:
2

OriginalGriff

Хм.
Код, который вы показываете, ничего не делает: вы создаете pv как новая коллекция:

List<ProductView> pv = new List<ProductView>();
Затем вы немедленно используете его в foreach петля:
foreach (var item in pv)
Но поскольку коллекция совершенно новая, она пуста, и тело цикла никогда не вводится. Что на самом деле является бонусом, потому что если бы это было так, то это не сработало бы. Посмотрите на тело вашей петли: pv не может быть нулевым - потому что вы создали новую коллекцию сразу же wearlier. Вы устанавливаете текстовое поле на один и тот же текст каждый раз, когда идете по кругу. Вы вызываете ToString для элемента, который (от его имени) уже является строкой. Текстовое поле даже не должно быть видно за пределами самой новой формы, поэтому, если вы не изменили его объявление на public этот код не будет компилироваться - а если и будет, то это очень плохая идея: элементы управления private таким образом, внутренняя работа формы не подвергается воздействию внешнего мира, и вы можете изменить ее, не испортив "внешний мир" вообще.

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

Честно говоря, это похоже на "панический код" - тип, который собирается вместе, когда кто-то не думает о том, что он делает, прежде чем атаковать клавиатуру. Я бы настоятельно посоветовал вам подумать о том, что вы делаете на некоторое время, а затем отказаться от этого и начать все сначала.


gokhan572

В pv уже есть значения. Затем я использовал его в цикле foreach. Модификаторы состояние текстового поля в новой форме уже задано как общедоступное. Пожалуйста, дайте мне знать ваше решение, основанное на этой информации. Заранее спасибо.

Dave Kreskowiak

Только не в том коде, который вы разместили. pv это пустой список.

gokhan572

я знаю, что это выглядит пустым списком, но у меня есть другой метод для этого. Так что мне нужна только помощь в этой области
nf.txtMyTextBox.Текстовая строка.Join(",", pv.Select(c => c.ProductName.Метод toString()).Метод toArray());
Когда я передаю данные в текстовое поле в той же форме , то это работает, но для другой формы-нет.

OriginalGriff

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

Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.

Рейтинг:
10

Karthik_Mahalingam

пробовать

NewForm nf = new NewForm(); 
            List<ProductView> pv = GetValuesFromDataGridView();
            if (pv != null) 
                 nf.txtMyTextBox.Text  =string.Join(",", pv.Select(c => c.ProductName));
            nf.Show();