Robert S4r Ответов: 2

Как передать datagridview несколько строк во вторую форму datagridview без метода доступа getter


Я хочу отправить datagridview несколько значений ячеек из одной формы в другую форму с помощью datagridview, когда обе формы открыты. Get set работает только для одной строки/ значения.
Другими словами, Я хочу пройти через datagridview в форме 1 и выбрать значение ячейки на основе условий и передать его в другую открытую форму 2.

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

Я пытался использовать только set accesor, но получить данные об ошибке не может быть использован в этом контексте, потому что он не имеет get accessor.

Открытые строковые данные
{
Набор
{
по каждому элементу (ячейки datagridviewrow Row в datagridview2.Строк)
row.cells["масштаб"].Value = значение;
}
}

2 Ответов

Рейтинг:
14

OriginalGriff

Методы Getter и setter не "работают только для одной строки/значения" - они работают для одного экземпляра типа класса, для которого объявлено свойство.
Так строковое свойство устанавливает и возвращает одну строку:

public string MyStringProperty
   {
   get { return myString; }
   set { myString = value; }
   }
а целочисленное свойство работает с одним целым числом:
public int MyIntegerProperty
   {
   get { return myInt; }
   set { myInt = value; }
   }
Но тип может быть любым! Пользовательский класс:
public MyClass MyClassProperty
   {
   get { return myClass; }
   set { myClass = value; }
   }

объект DataTable:
public DataTable MyDataTableProperty
   {
   get { return myDataGridView.DataSource; }
   set { myDataGridView.DataSource = value; }
   }
Список строк:
public List<string> MyStringListProperty
   {
   get { return myStringList; }
   set { myStringList = value; }
   }
Если вы хотите передать несколько значений, просто упакуйте их в соответствующую коллекцию и создайте свойство, которое получает и задает эту коллекцию...


Robert S4r

Я нахожу трудное время для упаковки и настройки коллекции. DataTable кажется лучшим вариантом, но он выдает ошибку
Невозможно неявно преобразовать тип object в system. Данных.Объект DataTable. существует явное преобразование....

{
get {return datagridview1. Источник данных;}
set {datagridview1.DataSource = значение;}
}

Любая помощь, пожалуйста!

OriginalGriff

Как вы объявили тип собственности?

Robert S4r

общественные объект DataTable dataTableF

OriginalGriff

Ах. Попробовать это:
get {return datagridview1. Источником данных объекта DataTable;}

Robert S4r

Это выдержка из того, что я пробовал.(Пока никаких результатов)

ИСТОЧНИК DATAGRIDVIEW - ФОРМА 2
--------------------------------------------------
публичный частичный класс Form2 : форма{
MySqlDataAdapter daStoreC = new MySqlDataAdapter(); DataSet dsStoreC = новый набор данных();
общественные формы Form2()
{метод InitializeComponent();}

частный недействительными Form2_Load(объект отправителя, EventArgs в электронной)
{LOAD_STORE_CONSUMPTION();}
public DataTable MyDataTableProperty
{get { return dataGridView2.DataSource as DataTable; }set
{ dataGridView2.DataSource = значение; }}

публичное событие EventHandler DataAvailable;
защищенных виртуальных недействительными OnDataAvailable(EventArgs в электронной)
{EventHandler eh = DataAvailable;
если (eh != null)
{ эх(Это, э); }}

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{OnDataAvailable(null);}

частный недействительными LOAD_STORE_CONSUMPTION()
{Connectionss.S_DB();
строка sqlStoreC = "SELECT * FROM store_stock";
пробовать{
MySqlConnection ConnStoreC = new MySqlConnection(Connectionss.cnString);
ConnStoreC.Открыть();
MySqlDataAdapter daStoreC = новый MySqlDataAdapter(sqlStoreC, ConnStoreC);
daStoreC.Fill(dsStoreC, "store_stock");
dataGridView2.Источник данных = dsStoreC;
dataGridView2.DataMember = "store_stock";
Консторек.Закрыть();
ConnStoreC.Распоряжаться();
}catch (Exception ex){MessageBox.Показать(напр.сообщение);}
}}
//===========================
ПУНКТ НАЗНАЧЕНИЯ DGV - ФОРМА 1

общественности частичного класс form1 : форма{

public Form1() {InitializeComponent();}

частный недействительными методе form1_load(объект отправителя, EventArgs в электронной)
{LOAD_STORE_CONSUMPTION();}
Form2_DataAvailable недействительным(объект отправителя, EventArgs в электронной)
{
Формы Form2 форме Form2 = отправитель в форме Form2;
if (form2 != null){
for (int i = 0; i <= dataGridView1.Rows.Граф - 1; i++)
{dataGridView1.Rows[i].Ячейки[2].Value = form2.MyDataTableProperty;
}}
}

частный недействительными LOAD_STORE_CONSUMPTION()
{........................}

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной){
Форме Form2 = новые формы Form2();
форма.DataAvailable += новый
Делегатом EventHandler(Form2_DataAvailable);
форма.Покажите();
}}


(ОБЕ ФОРМЫ ОТКРЫТЫ)

OriginalGriff

Прочтите ваш код. Как ты думаешь, что это значит?
В частности, как вы думаете, что это делает:

for (int i = 0; i <= dataGridView1.Rows.Граф - 1; i++)
{dataGridView1.Rows[i].Ячейки[2].Value = form2.MyDataTableProperty;
}

Robert S4r

Это прекрасно работало для меня.
currentRow.Ячейки[2].Значение.Метод toString();

На самом деле я пытаюсь добиться вот чего:-
Найдите любое значение ячейки [2] в form2 datagridview 2, сравните его с любым значением ячейки [2] в form1 datagridview 1. Если они соответствуют, то обновите ячейку[3] в datagridview 1. (Когда обе формы открыты)

OriginalGriff

Затем напишите пару методов в форме 2;
GetXY(int x, int y), который возвращает значение в столбце x, строке y
SetXY(тип int х, int и Г), который устанавливает значение в колонке "х", строка y
Назовите это в своем цикле и сравните ...
Вам не обязательно нужна вся партия, если вы это сделаете, получите DataTable вне цикла и сравните его значения X, Y.

Robert S4r

Есть какой-нибудь пример по этому поводу?

OriginalGriff

Ты ведь шутишь, правда? Вы уже используете этот код...

Robert S4r

Есть ли какая-то причина шутить? Я здесь, чтобы обратиться за помощью.

OriginalGriff

Потому что код, который вы мне показали, содержит код доступа к значению ячейки с адреса X и Y, так что происходит одна из трех вещей:

1) Вы не понимаете свой собственный код.
2) Вы не думаете о том, что пытаетесь сделать, и ожидаете, что мы сделаем это за вас.
Или
3) Вы шутите.

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

Robert S4r

То, что кажется очевидным для одного человека, не обязательно очевидно для другого. К счастью, вы можете принять одну из первых двух причин, но есть много причин для консультации в любом случае. Шутки не подходят для того, чтобы быть причиной для людей, у которых много работы!
Поэтому, если вы можете, я прошу о помощи, в конце концов, я бы не спрашивал, если бы у меня были ответы на все вопросы.
Естественно, некоторые люди понимают комплекс, но не понимают очевидного.

Честно говоря, из-за этого проекта ничего не происходит. Есть успех для текущего свойства row.cell, но неудача для этого случая.
Заранее спасибо.

OriginalGriff

Хорошо: что такое X и Y в этой строке:

dataGridView1.Rows[i].Ячейки[2].Значение = ...

Подсказка: они заключены в квадратные скобки.

Robert S4r

Я думаю, что x==i любая строка и y==2 ["третий столбец"]

На самом деле. Я уже давно использую VB.net там, где большинство этих свойств не нужны. Но по каким-то причинам не так давно мне пришлось переключиться на С#

OriginalGriff

X-это ссылка на столбец по традиции, а Y-строка, так что все наоборот.

И если вы знаете это, что мешает вам написать метод, который возвращает значение для определенной координаты X и Y?

Robert S4r

Проблема в том, как применить его к свойству get{return.....}.

OriginalGriff

Давайте вернемся на 9 часов назад, хорошо?
"Тогда напишите пару методов в форме 2;
GetXY(int x, int y), который возвращает значение в столбце x, строке y"

Там говорится о собственности?
Геттеры свойств не имеют параметров: вы не можете передать им координаты X,Y...

Robert S4r

Может быть, вы не совсем поняли мою проблему!

Как и где я могу подать заявление
&ГТ;&ГТ;&ГТ;&ГТ;&ГТ;GetXY(тип int х, int и г)&ЛТ;&ЛТ;&ЛТ;&ЛТ;&ЛТ;
в приведенном выше коде???

OriginalGriff

Да ладно тебе!

valueFromForm2 = form2.GetXY(2, i);
valueFromForm1 = dataGridView1.Rows[i].Ячейки[2].Значение;
if (valueFromForm1 == valueFromForm2)
{
// обновить ячейку 3 в форме 1 ...
}

Robert S4r

valueFromForm2 ????????

OriginalGriff

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

Robert S4r

Надеюсь, вы меня извините! Как я уже говорил ранее, я хорошо знаком с VB.net там, где большинство этих кодов не нужны. Я пытаюсь преобразовать свой проект в c# - требование.
Таким образом, некоторые вещи могут выглядеть слишком очевидными, но, как вы знаете, c# и VB.net они очень разные.
И то, чего я хочу достичь, кажется недоступным в интернете, потому что я исследовал его в течение двух хороших недель.
Вот почему я ищу живые примеры для совершения конверсий.

Спасибо! Хотя у меня все еще есть ошибки с переменными!!!! скорее всего, позиционирование. Предыдущий код творит чудеса для текущей строки, но часть нескольких строк терпит неудачу, но все же он применяется к 7+ разделам.

OriginalGriff

- Простите? Они почти одинаковы, вплоть до того, что существует ряд онлайн-конвертеров, которые могут переключаться между ними.
И кроме того, чтобы изменить проект на новый язык, вы обычно начинаете с изучения нового языка (который, если вы знаете VB и, следовательно, the .NET framework well займет у опытного разработчика целый день)

Robert S4r

Я имею в виду следующее: просто этого кода в VB было достаточно для выполнения задачи, чего нельзя сказать о c#, поскольку он не генерирует ответа при преобразовании.

Private Sub TSMItemUpdateL_Click(sender As Object, e As EventArgs) обрабатывает TSMItemUpdateL.Click
LOAD_ALL()
Конец Подводной Лодки


Суб LOAD_ALL()
Dim allrows1 As Integer = Me.DataGridView1.Rows.Количество - 1
Dim allrows2 As Integer = Me.LowerDataGridView.Rows.Количество - 1
Если allrows1 > 0, то
Dim i, j как целое число
Для i = 0 до allrows1
Для j = 0 до allrows2
If IsDBNull(DataGridView1.Item("Y_", i).Value) Затем
ElseIf IsDBNull(DataGridView1.Item("T", i).Value) Затем
ElseIf IsDBNull(DataGridView1.Item("C_", i).Value) Затем
ElseIf IsDBNull(DataGridView1.Item("S_", i).Value) Затем
ElseIf IsDBNull(DataGridView1.Item("s", i).Value) Затем

Ключевые Слова Elseif Не IsDBNull(DataGridView1.Товар("не", я).Значение) = Не IsDBNull(LowerDataGridView.Item("Y_", j).Value) и
Not IsDBNull(DataGridView1.Item("T", i).Value) = Not IsDBNull(LowerDataGridView.Item("T", j).Value) и
Not IsDBNull(DataGridView1.Item("C_", i).Value) = Not IsDBNull(LowerDataGridView.Item("C_", j).Value) и
Not IsDBNull(DataGridView1.Item("S_", i).Value) = Not IsDBNull(LowerDataGridView.Пункт("S_", Дж).Значение) Затем

Если DataGridView1.Item("Y_", i).Value = LowerDataGridView.Item("Y_", j).значение тогда

Если DataGridView1.Item("T", i).Value = LowerDataGridView.Item("T", j).значение тогда
Если DataGridView1.Item("C_", i).Value = LowerDataGridView.Item("C_", j).значение тогда
Если DataGridView1.Item("S_", i).Value = LowerDataGridView.Item("S_", j).значение тогда

Если DataGridView1.Пункт("с").Значение = "в" тогда
LowerDataGridView.Пункт("Эни", Дж).Значение = DataGridView1.Пункт("INI_1", я).Значение

ElseIf IsDBNull(LowerDataGridView.Пункт("S_8", Дж).Значение) Затем
ElseIf DataGridView1.Item("s", i).Value = "COM"
Затем
Если LowerDataGridView.Пункт("S_8", Дж).Значение = DataGridView1.Пункт("с").Значение Тогда
LowerDataGridView.Пункт("S8I", Дж).Значение = DataGridView1.Пункт("INIT_1", я).Значение
Конец, Если
Конец, Если

Конец, Если

Конец, Если
Конец, Если
Конец, Если
Конец, Если
Следующий
Следующий
Конец, Если
Конец Подводной Лодки

Я перепробовал множество конвертеров как онлайн, так и оффлайн, включая (instant c#), и все они хорошо конвертируются, но безрезультатно при выполнении.
Прости! Я только что удалил его с платформы.

Надеюсь, вы меня понимаете. Я знаю процент c#, но вы не можете знать все, если только!

Рейтинг:
0

RickZeeland

Смотрите пример здесь: Передача данных между двумя формами в WinForms[^]

Возможно, вас также заинтересует привязка данных, которая является рекомендуемым способом, см. раздел о фильтрации для второй формы в этой превосходной статье: Подробное Руководство По Привязке Данных[^]


Robert S4r

В этом случае его форма 2 как будто не имеет представления datagridview.

RickZeeland

Вы имеете в виду пример привязки данных ?
Смотрите решение Griffs о том, как создать подходящее свойство.