У меня есть несколько выпадающих списков, весь код похож, и только один, CustomerSelector.SelectedValue, не работает. Я даже пытался установить такое значение: CustomerSelector.SelectedValue=32
.
Этот метод предназначен для загрузки всей информации о проекте в форму и вызывается в событии загрузки формы. Данные, кажется, загружаются нормально, я даже загрузил «id» в DisplayMember для проверки.
Есть идеи, что мешает установке SelectedValue?
void loadProjectInfo()
{
if (isProjectInfoLoaded == false)
{
try
{
DataTable dt4 = new DataTable();
DBConnector db4 = new DBConnector();
db4.query = "SELECT * FROM s1_pm_project WHERE id = " + JobID;
dt4 = db4.getDataTable();
DataRow PMProject = dt4.Rows[0];
ProjectNameTextbox.Text = PMProject["ProjectName"].ToString();
this.Text = ProjectNameTextbox.Text;
ProjectAddressTextbox.Text = PMProject["Address"].ToString();
ProjectAddressCity.Text = PMProject["City"].ToString();
ProjectAddressState.DataSource = USStates.States();
ProjectAddressState.ValueMember = "Abbreviations";
ProjectAddressState.DisplayMember = "Abbreviations";
ProjectAddressState.SelectedIndex = -1;
if (!Convert.IsDBNull(PMProject["State"]))
ProjectAddressState.SelectedValue = PMProject["State"].ToString();
ProjectAddressPostalCode.Value = (!Convert.IsDBNull(PMProject["ZipCode"])) ? Convert.ToInt32(PMProject["ZipCode"]) : 00000;
DBConnector db5 = new DBConnector();
db5.query = "SELECT id, Name FROM s1_customer ORDER BY Name ASC";
CustomerSelector.DisplayMember = "Name";
CustomerSelector.ValueMember = "id";
CustomerSelector.DataSource = db5.getDataTable();
CustomerSelector.SelectedIndex = -1;
//if (!Convert.IsDBNull(PMProject["CustomerID"]))
// CustomerSelector.SelectedValue = Convert.ToInt32(PMProject["CustomerID"]);
CustomerSelector.SelectedValue=32;
DBConnector db1 = new DBConnector();
db1.query = "SELECT id, description FROM s1_app_status WHERE id < 2";
ProjectInfo_Status.DataSource = db1.getDataTable();
ProjectInfo_Status.DisplayMember = "description";
ProjectInfo_Status.ValueMember = "id";
ProjectInfo_Status.SelectedValue = Convert.ToInt32(PMProject["IsActive"]);
DBConnector db2 = new DBConnector();
db2.query = "SELECT id, description FROM s1_pm_roll";
ProjectInfoRollSelector.DataSource = db2.getDataTable();
ProjectInfoRollSelector.ValueMember = "id";
ProjectInfoRollSelector.DisplayMember = "description";
ProjectInfoRollSelector.SelectedIndex = -1;
if (Convert.ToInt32(PMProject["RollID"]) > 0)
ProjectInfoRollSelector.SelectedValue = Convert.ToInt32(PMProject["RollID"]);
DBConnector db3 = new DBConnector();
db3.query = "SELECT id, fullname FROM s1_user WHERE id>1";
ProjectInfoPMSelector.DataSource = db3.getDataTable();
ProjectInfoPMSelector.ValueMember = "id";
ProjectInfoPMSelector.DisplayMember = "fullname";
ProjectInfoPMSelector.SelectedIndex = -1;
if (Convert.ToInt32(PMProject["PMID"]) > 0)
ProjectInfoPMSelector.SelectedValue = Convert.ToInt32(PMProject["PMID"]);
ProjectInfoJobNoTextbox.Text = PMProject["JobNo"].ToString();
ProjectInfoValueTextbox.Value = Convert.ToDecimal(PMProject["ApproxValue"]);
if (!Convert.IsDBNull(PMProject["StartDate"]))
StartDateSelector.Value = Convert.ToDateTime(PMProject["StartDate"]);
if (!Convert.IsDBNull(PMProject["ProjectedEndDate"]))
ProjectedEndDateSelector.Value = Convert.ToDateTime(PMProject["ProjectedEndDate"]);
if (!Convert.IsDBNull(PMProject["EndDate"]))
EndDateSelector.Value = Convert.ToDateTime(PMProject["EndDate"]);
CustomerPOTextbox.Text = PMProject["CustomerPO"].ToString();
SalesTaxRateTextbox.Value = Convert.ToDecimal(PMProject["SalesTaxRate"]);
if (!Convert.IsDBNull(PMProject["WarrantyBegin"]))
WarrantyBegin.Value = Convert.ToDateTime(PMProject["WarrantyBegin"]);
if (!Convert.IsDBNull(PMProject["WarrantyEnd"]))
WarrantyEnd.Value = Convert.ToDateTime(PMProject["WarrantyEnd"]);
loadContactList();
}
catch (Exception ex)
{
Errors.Exception(ex);
}
isProjectInfoLoaded = true;
}
}
Это вывод из SELECT id, Name FROM s1_customer ORDER BY Name ASC
:
я бы | Имя |
---|---|
22 | 18-8 Шерман-Оукс |
206 | Алехо Луго |
233 | Американо Билдерс, ООО |
235 | АМС Солюшнс, Инк. |
1 | Аррис Строители, Инк. |
209 | Крис Троуэр |
105 | Системы управления охлаждением CME |
53 | Положения береговой линии |
117 | Кортек Констракшн, Инк. |
6 | Услуги по поддержке развития, Inc. |
146 | Ист Бэй Ресторан Поставка Инк |
31 | Фитнес-мания |
7 | Фулкрам Строительство |
32 | Хардести энд Ассошиэйтс, Инк. |
135 | Ховардс Приборы, Инк. |
9 | Джей Рэй Строительство |
10 | Металлические изделия J&L |
12 | Джаханна Л. Николс Дизайн интерьера, Inc. |
69 | Джеймс Барб Констракшн, Инк. |
61 | JRE Construction, Inc. |
13 | Камран и Компания, Инк. |
15 | LA Deli Distributors, Inc. |
98 | Ловиса Америка, ООО |
40 | Мобильный клиент |
120 | Н КОРОНА |
180 | Н САНТА КЛАРА |
5 | ПРОДАЖА УСЛУГ N |
129 | ООО "Оранжкрест Пропертиз" |
223 | Другой клиент |
78 | Пасифик Вестлайн, Инк. |
Выход из SELECT * FROM s1_pm_project WHERE id=
:
я бы | Название проекта | Активен | Пользовательский ИД | RollID | PMID | JobNo | Приблизительное значение | Дата начала | Дата окончания | Проецеденддате | Заказ клиента | Ставка налога с продаж | EstimateID | ГарантияНачать | ГарантияКонец |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
141 | Горьяна - Карловы Вары | 1 | 32 | 1 | 23 | 22199 | 37000,00 | 2022-02-07 | 2022-04-29 | 2022-04-29 | 22-012-23 | 0,00 | НУЛЕВОЙ | 2022-04-29 | 2023-04-29 |
Если вы не получаете никаких ошибок, а другие поля со списком работают успешно, то уверены ли вы на 100%, что значения, возвращаемые из… Convert.ToInt32(PMProject["CustomerID"])
…, действительно являются допустимыми значениями, которые существуют в списке элементов поля со списком?
Если значение НЕ существует в списке элементов поля со списком, оно просто проигнорирует его и продолжит работу, ошибка не будет выдана. Строка кода... CustomerSelector.SelectedValue = Convert.ToInt32(PMProject["CustomerID"]);
... кажется хорошим местом для точки останова, чтобы вы могли проверить и убедиться, что возвращаемые значения являются значениями, которые действительно существуют в списке элементов со списком.
@JohnG ComboBox.SelectedValue имеет значение null в конструкторе формы.
@ Джими… спасибо за информацию. Я этого не знал. Однако выложенный код не выглядит так, как будто он находится в конструкторе формы, согласитесь, это плохое предположение с моей стороны, но если он находится в событии загрузки или вообще «после» конструктора, то разве код не должен работать? И почему другие поля со списком работают?
@JohnG Вот почему я попросил уточнить, в каком контексте вызывается этот код, а также когда [метод] не имеет смысла сам по себе, также включите контекст, в котором вызывается. Я не мог дозвониться до ОП, видимо.
@ Джими ... Я понимаю на 100%, я почти оцепенел от разъяснения ОП явно необходимой информации. Очевидно, я делаю много предположений, но это не редкость, когда ОП опускает необходимую информацию, как я уверен, вы уже знаете. Но спасибо за информацию о настройке значения комбо и конструкторе форм, я не знал об этом… Так что, спасибо, что указали на это.
@Jimi Этот метод вызывается в форме события загрузки.
Вам не нужно говорить мне, вы должны добавить информацию к вопросу. -- В любом случае, у вас есть SELECT id, Name FROM s1_customer
, затем CustomerSelector.DisplayMember = "Name"; CustomerSelector.ValueMember = "id";
, поэтому для SelectedValue должно быть установлено значение, представляющее id
, но у вас есть CustomerSelector.SelectedValue = Convert.ToInt32(PMProject["CustomerID"])
: поле CustomerID
отсутствует в запросе и псевдоним отсутствует, следовательно, это null
, или это вызывает исключение .
@Jimi PMProject["CustomerID"]
— это поле из другого запроса, см. выше. Чтобы проверить, работает ли это, я сделал MessageBox.Show(PMProject["CustomerID"].ToString());
, и он отображает действительное значение. Кроме того, я пробовал CustomerSelector.SelectedValue=32
, и до сих пор безуспешно.
Запрос - это то, что установлено в db5.query
, я понятия не имею, что такое PMProject["CustomerID"]
, его тип, является ли он допустимым селектором для чего db5.getDataTable()
, какова связь между s1_pm_project
и s1_customer
, если есть, то значение, которое вы пытаетесь установить на самом деле является частью того, что ComboBox имеет в качестве источника данных и т. д. -- Это, как правило, очень запутанная настройка, неудивительно, что она может вести себя хаотично.
@Jimi Я опубликовал результаты запросов, также в целях тестирования, я пытался выбрать такое значение CustomerSelector.SelectedValue=32
, но безуспешно.
Я проверил ваш код несколько раз, и он работает так, как ожидалось. Должно быть что-то еще. Если источник данных полей со списком установлен так, как вы показываете с данными, которые вы показываете… тогда он ДОЛЖЕН работать. Я предлагаю вам создать небольшой минимальный воспроизводимый пример, который воспроизводит проблему. Пожалуйста, редактировать свой вопрос и опубликуйте код, который четко воспроизводит проблему, которую вы описываете. Я хочу сказать, что без ясного примера проблемы, которую мы можем воспроизвести… предположения — это все, что вы можете получить.
Проблема оказалась с базой данных, в частности с полем id
в s1_customer
. По какой-то причине он имел атрибут «неподписанный». Когда это было удалено, все заработало, как ожидалось.
Где/когда вы используете этот код? -- Не исключайте метод, содержащий код, который вы публикуете. Когда это не имеет смысла само по себе, также включите контекст, в котором вызывается.