ComboBox.SelectedValue возвращает System.Data.DataRowView - PullRequest
0 голосов
/ 28 февраля 2019

Ошибка «Нет сопоставления между типом объекта System.Data.DataRowView и собственным типом известного управляемого поставщика».Теперь comBoxMuscleGroup.SelectedValue и comBoxTypeFitness.SelectedValue должны возвращать идентификаторы, но вместо этого они возвращают System.Data.DataRowView.Кто-нибудь может мне помочь?

код:

       private void TypeFitness()
       {
           string query = "SELECT Naam FROM TypeFitness";

           using (connection = new SqlConnection(connectionString))
           using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
           {
               DataTable data = new DataTable();
               adapter.Fill(data);

               comBoxTypeFitness.DisplayMember = "Naam";
               comBoxTypeFitness.ValueMember = "FitnessId";
               comBoxTypeFitness.DataSource = data;
           }
       }

       private void MuscleGroup()
       {
           string query = "SELECT Naam FROM MuscleGroup";

           using (connection = new SqlConnection(connectionString))
           using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
           {
               DataTable data = new DataTable();
               adapter.Fill(data);

               comBoxMuscleGroup.DisplayMember = "Naam";
               comBoxMuscleGroup.ValueMember = "MuscleId";
               comBoxMuscleGroup.DataSource = data;
           }
       }

       private void Exercises()
       {
           string query = "SELECT Naam FROM Xercises AS X " +
               "INNER JOIN MG_Exercise AS MGX ON MGX.ExerciseId = X.ExerciseId " +
               "WHERE MGX.MuscleId = @MuscleId AND X.FitnessId = @FitnessId";

           using (connection = new SqlConnection(connectionString))
           using (SqlCommand command = new SqlCommand(query, connection))
           using (SqlDataAdapter adapter = new SqlDataAdapter(command))
           {
               //int MuscleId = ((DataRowView)comBoxMuscleGroup.SelectedValue).Row.Field<int>("MuscleId");
            //int FitnessId = ((DataRowView)comBoxTypeFitness.SelectedValue).Row.Field<int>("FitnessId");

               command.Parameters.AddWithValue("@MuscleId", comBoxMuscleGroup.SelectedValue);
               command.Parameters.AddWithValue("@FitnessId", comBoxTypeFitness.SelectedValue);

               DataTable data = new DataTable();
               adapter.Fill(data);

               clbXcercises.DisplayMember = "Naam";
               clbXcercises.ValueMember = "ExerciseId";
               clbXcercises.DataSource = data;
           }

       }

1 Ответ

0 голосов
/ 28 февраля 2019

Свойства ValueMember и DisplayMember - это две строки, которые должны быть именами двух полей, предоставляющих значения из источника данных.
В ваших запросах нет полей, которые вы назвали ValueMember для своих комбинаций.
Таким образом, он не может дать точное значение в свойстве SelectedValue, а только имя класса, который используется для построения строки внутри комбо (DataRowView)

Если вы хотите получитьSelectedValue, установленный в значение MuscleID или FitnessID текущего выбранного элемента, который вам необходим для извлечения этих значений из базы данных.

Вам необходимо изменить свои запросы на

string query = "SELECT FitnessID, Naam FROM TypeFitness";

и

string query = "SELECT MuscleID, Naam FROM MuscleGroup";

также в окончательном запросе должен быть идентификатор упражнения

  string query = "SELECT ExerciseID, Naam FROM Xercises AS X " +
       "INNER JOIN MG_Exercise AS MGX ON MGX.ExerciseId = X.ExerciseId " +
       "WHERE MGX.MuscleId = @MuscleId AND X.FitnessId = @FitnessId";

Я предлагаю также всегда проверять наличие нулевого значения для свойства SelectedValue перед его использованием.

...