【问题标题】:weird result with c# winForms array of Listsc#winForms列表数组的奇怪结果
【发布时间】:2010-03-29 03:29:35
【问题描述】:

所以我试图将值存储在 C# winForms 中的列表数组中。在我制作 sql 语句的 for 循环中,一切正常:消息框每次输出不同的药物名称。

for (int i = 0; i < numberOfMeds; i++)
{

 queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id;

 using (var conn = new SqlConnection(connStr))
 using (var cmd = new SqlCommand(queryStr, conn))
 {
  conn.Open();

  using (SqlDataReader rdr = cmd.ExecuteReader())
  {
   while (rdr.Read())
   {
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"];
    medObject.medication_name = rdr["medication_name"].ToString();
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]);

    medsList[i].Add(medObject);

   }
  }
  conn.Close();

  MedicationTimelineClass medObjectx = medsList[i][0] as MedicationTimelineClass;
  MessageBox.Show(medObjectx.medication_name);
 }
}

但是,当我从循环中取出消息框代码时,这意味着应该填充列表数组,我总是得到相同的值:最后输入的值。相同的药物名称,无论我在括号之间加上什么数字。这就好像整个 Lists 数组都填充了相同的数据。

for (int i = 0; i < numberOfMeds; i++)
{

 queryStr = "select * from biological where medication_name = '" + med_names[i] + "' and patient_id = " + patientID.patient_id;

 using (var conn = new SqlConnection(connStr))
 using (var cmd = new SqlCommand(queryStr, conn))
 {
  conn.Open();

  using (SqlDataReader rdr = cmd.ExecuteReader())
  {
   while (rdr.Read())
   {
    medObject.medication_date = (DateTime)rdr["patient_history_date_bio"];
    medObject.medication_name = rdr["medication_name"].ToString();
    medObject.medication_dose = Convert.ToInt32(rdr["medication_dose"]);

    medsList[i].Add(medObject);

   }
  }
  conn.Close();


 }
}

MedicationTimelineClass medObjectx = medsList[0][0] as MedicationTimelineClass;
MessageBox.Show(medObjectx.medication_name);

这是怎么回事?

【问题讨论】:

  • 您应该显示一些前面的代码,因为它很可能与此有关。

标签: c# winforms list arrays


【解决方案1】:

看起来您在循环中重用了同一个 MedicationTimelineClass 对象。请记住,您的类是引用类型。您基本上是在列表中添加相同的引用,并更新存储在该引用处的对象中的属性值。最终,列表中的所有“项目”都指向同一个对象。

在每次迭代时实例化一个新的 MedicationTimelineClass 对象,然后将该新对象添加到您的列表中。

【讨论】:

  • 天哪,我不敢相信我又爱上了那个。一周前我遇到了同样的问题。真丢人…… :(
【解决方案2】:

在“while (rdr.Read())”循环中,您每次只是将相同的对象 (medObject) 添加到列表中。列表正在被同一个对象一遍又一遍地填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2022-08-17
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多