Member 13573938 Ответов: 1

Как получить значение int строки в combobox, то есть вставить значение int в другую таблицу базы данных с помощью хранимой процедуры


{"Операция кросс-потока недопустима: элемент управления 'cmbLateTxt' доступен из потока, отличного от потока, в котором он был создан."}

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

публичное перечисление ClientLate
<pre lang="c#">
{
СелеКТ = 1,
Insert_Select = 2
}
public void lateTimeMethod(ClientLate C_late, ComboBox cmbLateTxt)
{
using (SqlConnection con = new SqlConnection(_con))
{
SqlCommand cmd = con.CreateCommand();
УМК.CommandType = CommandType.Хранимая процедура;
УМК.Свойства Commandtext = "Select_All_Lateness";
против.Открыть();

if (C_late == ClientLate.Выбрать)
{
cmd.параметры.AddWithValue("@status", C_late);
SqlDataReader reader = cmd.Метода executereader();
в то время как (читатель.читать())
{
cmbLateTxt.Предметы.Добавить(читатель[0]);
}
}
остальное, если (C_late == ClientLate.Insert_Select)
{
if (cmbLateTxt != null)
{
идентификатор инт = инт.Синтаксический анализ(cmbLateTxt.Элемент.Метод toString());
cmd.параметры.AddWithValue("@status", C_late);
cmd.параметры.AddWithValue("@reason",id);
SetPromptLateness("Причина Успешно Отправлена");
int i = cmd.Метод executenonquery();
}

1 Ответов

Рейтинг:
1

OriginalGriff

Вы не можете получить доступ к элементам пользовательского интерфейса (элементам управления, формам) вообще, за исключением потока, в котором они были созданы: поток пользовательского интерфейса. Если вы попытаетесь, то получите исключение перекрестного потока.
Итак этот код:

cmbLateTxt.Items.Add(reader[0]);
не может быть выполнен в Вашем "новом" потоке.

Чтобы решить эту проблему, либо
1) вызовите свой контроль: Контроль.Вызов Метода (Делегата) (System.Окна.Формы)[^]
Или
2) Используйте класс BackgroundWorker (Класс BackgroundWorker (System.ComponentModel)[^] и выполните обновления элемента управления в обработчике событий ProgressChanged.


Member 13573938

он работает с первым оператором IF который загружает содержимое таблицы базы данных в comboBox,
это был оператор if Else, который вызывал это исключение ( "{"операция Кросс-потока недопустима: элемент управления 'cmbLateTxt' доступен из потока, отличного от потока, в котором он был создан."}")

OriginalGriff

Тогда вот этот кусочек:
cmbLateTxt.SelectedItem.Метод toString()
Та же проблема: вы не можете получить доступ к элементам пользовательского интерфейса вообще, кроме как в потоке, в котором они были созданы.

Member 13573938

как вызвать новый делегат для cmbLateTxt.SelectedItem.Метод toString() ???????
в другом случае не пересекать резьбу операции

OriginalGriff

Прочтите первую ссылку, которую я вам дал.