Мне интересно, как лучше всего изменить переменную из одной формы в другую.
У меня есть в 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... Я немного смущен тем, как поступить в этом... Любое предложение было бы неплохо
@JohnG, Form2 - это в основном 2 списка и 1 кнопка. В первом списке отображается весь первый столбец моих данных, который я могу перетащить во второй список. Затем я нажимал бы кнопку, и она брала бы сделанный мной выбор и использовала его для обновления представления Datagridview, которое у меня есть на Form1.
+ код GetListFilter, чтобы вы могли понять, как строится strWhere
Извините, если я что-то упустил. Form1 запущен, код в form1 вызывает метод Defaultview
, который выполняет запрос в соответствии со строками … «ВЫБЕРИТЕ mycolumn1, mycolumn2 FROM myTable WHERE XXX» … часть XXX строится из метода GetListFilter
… затем … запрос выполняется, и grid обновляется результатами запроса. Это прямолинейно, и я предполагаю, что это работает. ЗАТЕМ пользователь нажимает кнопку btn1
на форме1. Я предполагаю, что опубликованный код — это событие нажатия кнопки btn1
. В этом случае создается новая форма2, и вся форма1 передается в форму2.
Затем вы заявляете… «В этой форме2 у меня есть два списка, в которые я могу перетаскивать значения из первого в другое. Затем у меня есть кнопка2 в этой форме 2, и когда я нажимаю на нее, мне нужно изменить переменную strSQL (из формы 1), чтобы мой DatagridView в форме 1 мог отображать правильную информацию». … Тут я запутался. Я предполагаю, что form2 «строит» новый запрос из списков на form2. Похоже, вы хотели бы снова вызвать метод GetListFilter
формы 1, однако он будет использовать списки из формы 1, а не из формы 2.
Я предполагаю, что form2 создает «новый» запрос из списков на form2. Если это так, то я рекомендую вам изменить метод Defaultview
, чтобы он принимал строковый параметр, который является запросом, который вы хотите выполнить. Эта строка будет содержать «весь» запрос. Затем для формы 1 потребуется новый метод, который «создает» эту строку запроса из своих списков, а для формы 2 также будет метод для создания строки запроса из своих списков. Это будет означать, что вам нужно будет удалить метод GetListFilter
из метода Defaultview
.
Затем в form1 вы должны построить запрос, используя новый метод, который вызывает метод GetFilter
. Затем передайте эту строку запроса измененному методу Defaultview
для выполнения. Затем в форме2 код делает то же самое, он создает новую строку запроса, используя свои списки в форме2, и возвращает эту строку в форму1. После того, как строка будет возвращена в form1, пусть form1 вызовет метод Defaultview
со строкой запроса из form2. Опять же, это предположение с моей стороны, и я чувствую, что что-то упускаю.
@JohnG, спасибо за попытку разобраться с этим. Итак, чтобы ответить вам, да, вы полностью поняли, что происходит. На самом деле я не уверен, что передам Form1 при создании новой Form2... Но я думаю, что понимаю, что вы будете делать... своего рода отдельный GetListFilter из Defaultview, чтобы иметь "общий" Defaultview, который обновляется одним настроенным запрос в Form1 или другой настраиваемый запрос в Form2. Хорошо, это звучит неплохо, но мне нужно убедиться, что Datagridview в Form1. В конце концов, я должен вернуться на Form1
Я просто говорю, что в форме 1 метод Defaultview
может работать ТОЛЬКО для формы 1, потому что он вызывает GetListFilter
ВНУТРИ метода. Если вы вытащите эту часть кода из метода Defaultview
и просто «передадите» ПОЛНУЮ строку запроса, то вы можете вызвать метод, используя строку запроса из формы 1, А также строку запроса из формы 2. Надеюсь это имеет смысл.
На самом деле нет необходимости передавать form1 в form2. Вместо этого в форме 2 создайте «общедоступную» переменную string
, назовите ее как-то вроде form2query
, затем в форме 2 создайте запрос из списков, а затем установите этот строковый запрос в переменную form2query
. Тогда в form1 при вызове form2 ничего ей не передавайте, а используйте ShowDialog
вместо Show
Тогда в form1 у вас будет что-то вроде… var form2 = new Form2();
form2.ShowDialog();
… на этом код остановится и подождет, пока форма2 не закроется.
После того, как форма2 закрыта, форма1 должна иметь возможность получить переменную формы2 form2query
например... string f2query = form2.form2query
... это один из способов передать данные обратно в форму1 из формы2.
@JohnG Спасибо за эти идеи, чувак! Поэтому я немного продвинулся вперед, я отделил функцию «GetListFromfilter» от Defaultdaataview (бонус: ответ кажется быстрее!). Затем я создал переменную form2query в form2, как вы предложили. Я не далеко! Но теперь, когда я запускаю код шаг за шагом, я вижу, что элементы, которые я перетаскиваю во второй список, не учитываются как SelectedItems...
К сожалению, я понятия не имею, почему «второй список не учитывается как SelectedItems»… Это было бы предположением с моей стороны, поскольку я не знаю, какой код выполняется. Я предлагаю вам отредактировать свой вопрос и ДОБАВИТЬ эту дополнительную информацию вместе с любыми другими изменениями кода. ЕСЛИ ВЫ СДЕЛАЕТЕ ЭТО… НЕ УДАЛЯЙТЕ исходный вопрос и код… ДОБАВЬТЕ эту дополнительную информацию ПОД существующим вопросом и кодом. Вы можете добавить строку заголовка, например «EDIT…», чтобы указать, что информация ниже была добавлена позже. Очевидно, вам нужно будет добавить дополнительный текст, чтобы описать, что делает код и что не работает.
Ха-ха, JohnG, это был глупый вопрос, не беспокойтесь, я нашел трюк: если вы помещаете элементы в список, просто прокручивайте «Items» вместо selectedItems! Я дам вам знать, если я разберусь с передачей переменной по-вашему :)
@JohnG, это сработало! Большое вам спасибо :) В общем, вот схема: используйте showdialog() вместо show() в форме1. Используйте функцию "defaultview", которая просто устанавливает SQL-соединение и имеет "всю" строку запроса в качестве параметра. Используйте в form1 и form2 две разные функции конструктора запросов (одна адаптирована для элементов управления From1, другие — для элементов управления Form2). После того, как конструктор строкового запроса создал строковый SQL, передайте его в defautview. В form2 используйте общедоступную строку, которая будет обновлена и отправлена в Form1 после закрытия Form2 с использованием Form2.Querystring в Form1.
Если я правильно понимаю, я думаю, вам нужно что-то вроде этого в какой-то момент в Form2:
Form1 form1;
form1 = (Form1)Application.OpenForms["Form1"];
if (form1 != null)
{
form1.UpdateStuff(var someParam);
}
Итак, ваша форма Form1 находится в приложении, а затем вы вызываете общедоступный метод (UpdateStuff), чтобы сделать то, что вам нужно.
Непонятно, «что» форма 2 делает с переменной
strSQL
. Что касается вопроса… «Должен ли я обновить sql-запрос моей формы Form1 из Form2»?… поскольку код передает всю форму form1 в form2, я не уверен, какая разница, «где» вы обновляете sql-запрос. Где выполняется запрос? Опять же, трудно понять, «что» form2 «меняет» в отношении sql-запроса.