0

错误是“不存在从对象类型 System.Data.DataRowView 到已知托管提供程序本机类型的映射。” 现在应该返回 Id comBoxMuscleGroup.SelectedValuecomBoxTypeFitness.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;
           }

       }
4

1 回答 1

2

属性 ValueMember 和 DisplayMember 是两个字符串,它们应该是提供来自 DataSource 的值的两个字段的名称。
您的查询不包含您为组合命名为 ValueMember 的字段。
因此,它不可能在属性 SelectedValue 中给出精确值,而只能给出用于在组合内构建行的类的名称(DataRowView)

如果要将 SelectedValue 设置为当前选定项目的 MuscleID 或 FitnessID 值,则需要从数据库中提取这些值。

您需要将查询更改为

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

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

最后的查询也需要有练习ID

  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 属性之前始终检查 null 。

于 2019-02-28T14:01:24.240 回答