VB.Net WinForms Ссылка Combobox SelectedValue с использованием ActiveForms.Controls - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь получить SelectedValue комбинированного списка без указания имени формы с помощью ActiveForm. Он используется в Query, который находится в файле класса и может использоваться в двух разных формах, поэтому он должен быть универсальным.

Dim AcctDetailsAdapter As New SQLiteDataAdapter("SELECT * FROM [Accounts] WHERE_
[AcctName] = '" & Form.ActiveForm.Controls("SelectAccount").SelectedValue & "'", db.connect)

В приведенном ниже разделе он явно ломается, и я не могу подойтидругим способом.

Form.ActiveForm.Controls("SelectAccount").SelectedValue

Я могу использовать это при ссылках на текстовые поля без проблем, но в моем запросе, где мне нужно использовать «selectedvalue», я не могу найти решение. Любые идеи или альтернативные направления, о которых я не думаю? Я чрезвычайно новичок в vb.net.

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

UPDATE:Я смог заставить это работать правильно с помощью Jimi, используя код ниже:

Dim SelectedAccount = TryCast(Form.ActiveForm.Controls.Find("SelectAccount", True).FirstOrDefault, ComboBox).SelectedValue.ToString()
Dim AcctDetailsAdapter As New SQLiteDataAdapter($"SELECT * FROM [Accounts] WHERE [AcctName] = '{SelectedAccount}'", db.connect)

Надеюсь, это поможет с передачей параметров в запрос, на который ссылается @ jmcilhinney.

У меня есть последний вопрос, теперь использующий этот же принципал, он не работает для ToolStripStatusLabel, потому что технически это не элемент управления?

TryCast(Form.ActiveForm.Controls.Find("StatusLabel", True).FirstOrDefault, ToolStripStatusLabel).Text = "test"

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Я все еще борюсь с этим, к сожалению ...

Ну, во-первых, ActiveForm не всегда возвращает активную форму. Например, если ваше приложение не является активным приложением или теряет фокус или деактивируется при выполнении кода, тогда ActiveForm возвращает Nothing / null.

Представьте, что происходит в этом случае при выполнении:

TryCast(ActiveForm.Controls.Find("SelectAccount", True).FirstOrDefault, ComboBox)

Это может быть истолковано как: найти в ничто ничто и попытаться преобразовать возвращенное ничто в комбинированное окно!

Хорошей практикой является использование нулевых условных операторов , чтобы избежатьисключения в случаях как таковых.

Dim cmb = TryCast(ActiveForm?.Controls.Find("SelectAccount", True).FirstOrDefault, ComboBox)

If cmb IsNot Nothing Then
   '....
End If

Также убедитесь, что целевая форма активна перед выполнением кода. Например;вызовите Activate метод этой формы.

У меня есть последний вопрос, использующий этот же принципал, он не работает для ToolStripStatusLabel, поскольку технически он не является элементом управления?

Вам нужно получить контейнер StatusStrip , после чего вы сможете получить доступ к его элементам панели инструментов.

Dim ss = TryCast(ActiveForm?.Controls.Find("StatusStrip1", True).FirstOrDefault, StatusStrip)

If ss IsNot Nothing Then
  ss..Items("StatusLabel").Text = "---"
End If

Удачи

0 голосов
/ 15 октября 2019

Когда вы индексируете коллекцию Controls, вы получаете ссылку Control. Предположительно, вы используете свойство Text для TextBox. Text является членом класса Control, поэтому вы можете использовать его для любого элемента управления. SelectedValue является членом класса ComboBox, поэтому вы должны использовать этот тип для доступа к этому члену. Если вы хотите быть в безопасности, вы должны подтвердить, что есть такой элемент управления, например

Dim cb = TryCast(Form.ActiveForm.Controls("SelectAccount"), ComboBox)

If cb IsNot Nothing Then
    'There is a ComboBox with that name on the active form, so use 'cb' here.
    Dim AcctDetailsAdapter As New SQLiteDataAdapter($"SELECT * FROM [Accounts] WHERE [AcctName] = '{cb.SelectedValue}'", db.connect)

Вы действительно должны использовать параметры для вставки значений в код SQL, а не для конкатенации строк любого рода. Даже если вы в безопасности от внедрения SQL, все еще существует вероятность ошибок форматирования или непарных одинарных кавычек, например, ваш запрос не будет выполнен, если значение равно «O'Brien». Если вы просто используете параметры каждый раз, тогда вы не ошибетесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...