С# Изменить SQL-запрос и DGV Form1 из другой Form2

Мне интересно, как лучше всего изменить переменную из одной формы в другую.

У меня есть в Form1 представление данных, которое обновляется с помощью sql-запроса и элементов управления списком. Итак, когда я выбираю элементы в своих списках From1, он изменяет запрос sql, который будет обновлять DGV:

public void Defaultview()
    {
        string strSQL = "SELECT mycolumn1, mycolumn2 FROM myTable";
        string strWhere;
        string connetionString = @"Data Source=mydatasource;Initial Catalog=myDB;Integrated Security=SSPI";            
        strWhere = GetListFilter(tableLayoutPanelForm1);
            if (strWhere != null)
            {
                strSQL += " WHERE " + strWhere;
            }
        SqlConnection cnn = new SqlConnection(connetionString);
        SqlDataAdapter adapter= new SqlDataAdapter(strSQL, cnn);
        DataTable Dt = DataTable();
        adapter.Fill(Dt);
        dataGridView1.DataSource = Dt;
    }

Функция GetListFilter будет перебирать все мои списки и обновлять strWhere в функции selectedItems из списков.

  public string GetListFilter(Control ctrlContainer)
    {
        string strWhere = null;

        foreach (Control ctrl in ctrlContainer.Controls)
        {
            string strCondition = null;
            // ListBox handling
            if (ctrl.GetType() == typeof(ListBox) && ctrl.Name.Contains("CFRA") == true)
            {
                ListBox lb = ctrl as ListBox;

                foreach (var li in lb.SelectedItems)
                {

                    strCondition += $"'{li}',";

                }
                if (strCondition != null)
                {
                    if (strWhere == null)
                    {
                        strCondition = strCondition.TrimEnd(',');
                        strWhere += $"{ctrl.Name.Substring(13)} IN ({strCondition})";
                    }
                    else if (strWhere != null)
                    {
                        strCondition = strCondition.TrimEnd(',');
                        strWhere += $" AND {ctrl.Name.Substring(13)} IN ({strCondition})";
                    }
                }
            }

        }
        return strWhere;
    }

Хорошо, теперь я нажимаю кнопку 1 из этой формы 1, и появляется форма 2:

private void btn1(object sender, EventArgs e)
    {
        var Form2 = new Form2(this);
        Form2.Show();
        Form2.TopMost = true;
    }

В этой форме2 у меня есть два списка, которые я могу перетаскивать из первого в другое. Затем у меня есть кнопка2 в этой форме2, и когда я нажимаю на нее, мне нужно изменить переменную strSQL (из формы1), чтобы мой DatagridView в форме1 мог отображать правильную информацию.

Итак, мой вопрос: в конце концов, только строку «strWhere» нужно обновить с помощью выбора списка Form2, поэтому я должен обновить мой sql-запрос Form1 из Form2? Или, может быть, создать новую таблицу данных в форме 2, которую я отправлю в свой DGV в форме 1? Или просто создайте новый экземпляр моей формы Form1, когда я нажму кнопку моей формы Form2, но в этом случае, как я могу принять во внимание новый выбор моей формы Form2... Я немного смущен тем, как поступить в этом... Любое предложение было бы неплохо

Непонятно, «что» форма 2 делает с переменной strSQL. Что касается вопроса… «Должен ли я обновить sql-запрос моей формы Form1 из Form2»?… поскольку код передает всю форму form1 в form2, я не уверен, какая разница, «где» вы обновляете sql-запрос. Где выполняется запрос? Опять же, трудно понять, «что» form2 «меняет» в отношении sql-запроса.

JohnG 14.12.2020 12:33

@JohnG, Form2 - это в основном 2 списка и 1 кнопка. В первом списке отображается весь первый столбец моих данных, который я могу перетащить во второй список. Затем я нажимал бы кнопку, и она брала бы сделанный мной выбор и использовала его для обновления представления Datagridview, которое у меня есть на Form1.

Pierre_CM 14.12.2020 12:37

+ код GetListFilter, чтобы вы могли понять, как строится strWhere

Pierre_CM 14.12.2020 12:43

Извините, если я что-то упустил. Form1 запущен, код в form1 вызывает метод Defaultview, который выполняет запрос в соответствии со строками … «ВЫБЕРИТЕ mycolumn1, mycolumn2 FROM myTable WHERE XXX» … часть XXX строится из метода GetListFilter… затем … запрос выполняется, и grid обновляется результатами запроса. Это прямолинейно, и я предполагаю, что это работает. ЗАТЕМ пользователь нажимает кнопку btn1 на форме1. Я предполагаю, что опубликованный код — это событие нажатия кнопки btn1. В этом случае создается новая форма2, и вся форма1 передается в форму2.

JohnG 14.12.2020 14:00

Затем вы заявляете… «В этой форме2 у меня есть два списка, в которые я могу перетаскивать значения из первого в другое. Затем у меня есть кнопка2 в этой форме 2, и когда я нажимаю на нее, мне нужно изменить переменную strSQL (из формы 1), чтобы мой DatagridView в форме 1 мог отображать правильную информацию». … Тут я запутался. Я предполагаю, что form2 «строит» новый запрос из списков на form2. Похоже, вы хотели бы снова вызвать метод GetListFilter формы 1, однако он будет использовать списки из формы 1, а не из формы 2.

JohnG 14.12.2020 14:01

Я предполагаю, что form2 создает «новый» запрос из списков на form2. Если это так, то я рекомендую вам изменить метод Defaultview, чтобы он принимал строковый параметр, который является запросом, который вы хотите выполнить. Эта строка будет содержать «весь» запрос. Затем для формы 1 потребуется новый метод, который «создает» эту строку запроса из своих списков, а для формы 2 также будет метод для создания строки запроса из своих списков. Это будет означать, что вам нужно будет удалить метод GetListFilter из метода Defaultview.

JohnG 14.12.2020 14:02

Затем в form1 вы должны построить запрос, используя новый метод, который вызывает метод GetFilter. Затем передайте эту строку запроса измененному методу Defaultview для выполнения. Затем в форме2 код делает то же самое, он создает новую строку запроса, используя свои списки в форме2, и возвращает эту строку в форму1. После того, как строка будет возвращена в form1, пусть form1 вызовет метод Defaultview со строкой запроса из form2. Опять же, это предположение с моей стороны, и я чувствую, что что-то упускаю.

JohnG 14.12.2020 14:04

@JohnG, спасибо за попытку разобраться с этим. Итак, чтобы ответить вам, да, вы полностью поняли, что происходит. На самом деле я не уверен, что передам Form1 при создании новой Form2... Но я думаю, что понимаю, что вы будете делать... своего рода отдельный GetListFilter из Defaultview, чтобы иметь "общий" Defaultview, который обновляется одним настроенным запрос в Form1 или другой настраиваемый запрос в Form2. Хорошо, это звучит неплохо, но мне нужно убедиться, что Datagridview в Form1. В конце концов, я должен вернуться на Form1

Pierre_CM 14.12.2020 14:12

Я просто говорю, что в форме 1 метод Defaultview может работать ТОЛЬКО для формы 1, потому что он вызывает GetListFilter ВНУТРИ метода. Если вы вытащите эту часть кода из метода Defaultview и просто «передадите» ПОЛНУЮ строку запроса, то вы можете вызвать метод, используя строку запроса из формы 1, А также строку запроса из формы 2. Надеюсь это имеет смысл.

JohnG 14.12.2020 14:15

На самом деле нет необходимости передавать form1 в form2. Вместо этого в форме 2 создайте «общедоступную» переменную string, назовите ее как-то вроде form2query, затем в форме 2 создайте запрос из списков, а затем установите этот строковый запрос в переменную form2query. Тогда в form1 при вызове form2 ничего ей не передавайте, а используйте ShowDialog вместо Show Тогда в form1 у вас будет что-то вроде… var form2 = new Form2();form2.ShowDialog(); … на этом код остановится и подождет, пока форма2 не закроется.

JohnG 14.12.2020 14:25

После того, как форма2 закрыта, форма1 должна иметь возможность получить переменную формы2 form2query например... string f2query = form2.form2query... это один из способов передать данные обратно в форму1 из формы2.

JohnG 14.12.2020 14:27

@JohnG Спасибо за эти идеи, чувак! Поэтому я немного продвинулся вперед, я отделил функцию «GetListFromfilter» от Defaultdaataview (бонус: ответ кажется быстрее!). Затем я создал переменную form2query в form2, как вы предложили. Я не далеко! Но теперь, когда я запускаю код шаг за шагом, я вижу, что элементы, которые я перетаскиваю во второй список, не учитываются как SelectedItems...

Pierre_CM 15.12.2020 09:13

К сожалению, я понятия не имею, почему «второй список не учитывается как SelectedItems»… Это было бы предположением с моей стороны, поскольку я не знаю, какой код выполняется. Я предлагаю вам отредактировать свой вопрос и ДОБАВИТЬ эту дополнительную информацию вместе с любыми другими изменениями кода. ЕСЛИ ВЫ СДЕЛАЕТЕ ЭТО… НЕ УДАЛЯЙТЕ исходный вопрос и код… ДОБАВЬТЕ эту дополнительную информацию ПОД существующим вопросом и кодом. Вы можете добавить строку заголовка, например «EDIT…», чтобы указать, что информация ниже была добавлена ​​позже. Очевидно, вам нужно будет добавить дополнительный текст, чтобы описать, что делает код и что не работает.

JohnG 15.12.2020 09:38

Ха-ха, JohnG, это был глупый вопрос, не беспокойтесь, я нашел трюк: если вы помещаете элементы в список, просто прокручивайте «Items» вместо selectedItems! Я дам вам знать, если я разберусь с передачей переменной по-вашему :)

Pierre_CM 15.12.2020 10:00

@JohnG, это сработало! Большое вам спасибо :) В общем, вот схема: используйте showdialog() вместо show() в форме1. Используйте функцию "defaultview", которая просто устанавливает SQL-соединение и имеет "всю" строку запроса в качестве параметра. Используйте в form1 и form2 две разные функции конструктора запросов (одна адаптирована для элементов управления From1, другие — для элементов управления Form2). После того, как конструктор строкового запроса создал строковый SQL, передайте его в defautview. В form2 используйте общедоступную строку, которая будет обновлена ​​и отправлена ​​​​в Form1 после закрытия Form2 с использованием Form2.Querystring в Form1.

Pierre_CM 15.12.2020 11:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
15
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, я думаю, вам нужно что-то вроде этого в какой-то момент в Form2:

    Form1 form1;
    form1 = (Form1)Application.OpenForms["Form1"];
    if (form1 != null)
    {
        form1.UpdateStuff(var someParam);
    }

Итак, ваша форма Form1 находится в приложении, а затем вы вызываете общедоступный метод (UpdateStuff), чтобы сделать то, что вам нужно.

Другие вопросы по теме