【问题标题】:read value member from combobox populated using dictionary从使用字典填充的组合框中读取值成员
【发布时间】:2018-10-12 14:03:43
【问题描述】:

我在form_load 事件中使用dictionary 填充了combobox,其值和显示成员如下

Dictionary<string, int> GravelCount = new Dictionary<string, int>
{
    {1,"text value 1"},
    {2,"text value 2"},
};

CB_GravelCount.DataSource = new BindingSource(GravelCount, null);
CB_GravelCount.DisplayMember = "Key";
CB_GravelCount.ValueMember = "Value";
CB_GravelCount.SelectedIndex = -1;

此值成员存储到 sql server 数据库中...一切正常,直到我尝试读取此存储的数据并在发生 form_load 事件时重新分配给 combobox 数据不会被分配组合框值什么都不显示,因为它得到索引 -1 而没有错误

public int GetPersonification()
{
    string connStr = ConfigurationManager.ConnectionStrings["SRJDconnstr"].ToString();
    string cmdStr = @"SELECT ID,
                                             SIZ,
                                             PLACE,
                                             ONE_OR_MORE,
                                             R_OR_L,
                                             EKO_OR_ASH,
                                             NOTICE
                                     FROM PERSONIFICATION
                                   WHERE SEANCE_ID=@SEANCE_ID;";

    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
    {

            conn.Open();
            cmd.CommandText = cmdStr;
            cmd.CommandType = CommandType.Text;

            cmd.Parameters.Add(new SqlParameter("@SEANCE_ID", SqlDbType.Int)).Value = F0102.vSessionID;

            SqlDataReader sqlReader = cmd.ExecuteReader();

            while (sqlReader.Read())
            {
                PersonificationID = Convert.ToInt32(sqlReader[0].ToString());
                TB_Size.Text = sqlReader[1].ToString();                              //SIZ
                CB_TreatmentPlace.SelectedValue = sqlReader[2].ToString(); //PLACE
                CB_GravelCount.SelectedValue = sqlReader[3].ToString();      //ONE_OR_MORE
                CB_Side.SelectedValue = sqlReader[4].ToString();                 //R_OR_L
                CB_TreatmentWay.SelectedValue = sqlReader[5].ToString(); //EKO_OR_ASH
                TB_Note.Text = sqlReader[6].ToString();                             //NOTICE
            }
            return 1;
    }
}

【问题讨论】:

  • GravelCount 是 Dictionary 但值是 。它编译了吗?
  • @ErcanPeker 是的,它是编译的,当我试图让它 我得到错误

标签: c# visual-studio-2013 combobox .net-4.0


【解决方案1】:

解析为int。

CB_GravelCount.SelectedValue = int.Parse(sqlReader[3].ToString());

【讨论】:

    【解决方案2】:

    从数据库读取时您很可能遇到错误。在代码的 SqlDataReader 部分周围放置一个 try/catch 以查看究竟是什么失败了。我的猜测是,您的数据列之一为空值,导致 ToString 失败或 PersonificationId 的 Convert.ToInt32 失败。阅读返回的异常消息很可能会让您朝着正确的方向前进。 试试这个:

    public int GetPersonification()
    {
      string connStr = ConfigurationManager.ConnectionStrings["SRJDconnstr"].ToString();
      string cmdStr = @"SELECT ID,
                              SIZ,
                            PLACE,
                      ONE_OR_MORE,
                            R_OR_L,
                        EKO_OR_ASH,
                            NOTICE
              FROM PERSONIFICATION
              WHERE SEANCE_ID=@SEANCE_ID;";
    
      using (SqlConnection conn = new SqlConnection(connStr))
      using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
      {
        //Add the try here
        try
        {
          conn.Open();
          cmd.CommandText = cmdStr;
          cmd.CommandType = CommandType.Text;
    
          cmd.Parameters.Add(new SqlParameter("@SEANCE_ID", SqlDbType.Int)).Value = F0102.vSessionID;
    
          SqlDataReader sqlReader = cmd.ExecuteReader();
          int? persId = null;
          string siz,
          string place = "";
          string one_or_more = "";
          string r_or_l = "";
          string eko_or_ash = "";
          string notice = "";
          while (sqlReader.Read())
          {
              persId = sqlReader["ID"] as int? ?? default(int);
              siz = sqlReader["SIZ"] as string;
              place = sqlReader["PLACE"] as string;
              one_or_more = sqlReader["ONE_OR_MORE"] as string;
              r_or_l = sqlReader["R_OR_L"] as string;
              eko_or_ash = sqlReader["EKO_OR_ASH"] as string;
              notice = sqlReader["NOTICE"] as string;
          }
          PersonificationID = persId ?? 0; //null coalesce
          TB_Size.Text = siz;
          CB_TreatmentPlace.SelectedValue = place;
          CB_GravelCount.SelectedValue = one_or_more;
          CB_Side.SelectedValue = r_or_l;
          CB_TreatmentWay.SelectedValue = eko_or_ash;
          TB_Note.Text = notice;
          return 1;
        }
        catch (Exception ex)
        {
          //Read the exception message using your debugger.
          return 0;
        }
      }
    }
    

    【讨论】:

    • 我没有错误或异常有或没有异常部分顺便说一句值可能有空值
    • 我更改了代码,以便您可以看到查询的返回值。单步执行此代码以查看是否可以检测到错误。
    猜你喜欢
    • 2015-03-08
    • 2013-03-12
    • 2013-12-04
    • 2022-01-06
    • 1970-01-01
    • 2023-04-01
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多