У меня есть комбинированное окно в сетке данных, заполняемой из таблицы DataSet, и элемент значения просто возвращает "SmashRosterID" в базу данных, которая является именем столбца. Как я могу заставить его фактически выбрать значение идентификатора?
Вот код добавляемого столбца и данные для заполняемого ComboBox:
rosterDataAdapter = new SQLiteDataAdapter(
@"SELECT SmashRosterID,CharacterName FROM SmashRoster", cnn);
rosterNames = new DataSet();
rosterDataAdapter.Fill(rosterNames);
championTest = new DataGridViewComboBoxColumn();
championTest.Name = "ChampionTest";
championTest.DataSource = rosterNames.Tables[0];
championTest.ValueMember = "SmashRosterID"; //doesn't work
championTest.DisplayMember = "CharacterName"; //works
tournamentsGridView.Columns.Add(championTest);
А вот и обновлениеоператор, который я использую для обратной записи в базу данных:
allTournamentDataAadapter.UpdateCommand = new SQLiteCommand(
"UPDATE SmashTournaments SET TournamentName = @TournamentName, Champion = @Champion," +
"RunnerUp = (SELECT R2.SmashRosterID FROM SmashRoster R2 WHERE CharacterName = @RunnerUp) WHERE TournamentID = @TournamentID", cnn);
allTournamentDataAadapter.UpdateCommand.Parameters.AddWithValue(
"@Champion", championTest.ValueMember);
allTournamentDataAadapter.Update(allTournamentData);
Остальные параметры в настоящее время работают, поэтому я пропустил их в коде, чтобы было легче увидеть, в чем заключается проблема. Это то, что записывается обратно в БД:
РЕДАКТИРОВАТЬ: я теперь изменил оператор параметра на:
allTournamentDataAadapter.UpdateCommand.Parameters.Add(
"@Champion", DbType.Int64, 3, "ChampionTest");
Я изменил это на это, потому что я узнал, что мне действительно нужно вытащить CellValue, потому что у DataGridViewComboBoxColumn нет SelectedValue или чего-либо подобного, скорее, когда элемент выбирается из ComboBox, CellValue изменяется с помощью ValueMember. Тем не менее, это все еще не работает. Это просто не обновляет колонку сейчас. ValueMember может быть установлен неправильно. Не уверен.
Я экспериментировал с tournamentsGridView.CurrentRow.Cells["ChampionTest"].Value
, но мне все еще не повезло. Пожалуйста, порекомендуйте.
РЕДАКТИРОВАТЬ 2: MessageBox.Show(tournamentsGridView.CurrentRow.Cells["ChampionTest"].Value.ToString());
показывает правильный идентификатор. Таким образом, значение выбирается. Просто написано не правильно, я думаю. Также MessageBox.Show(tournamentsGridView.CurrentRow.Cells["ChampionTest"].ValueType.ToString());
Показывает, что значением является Int64.