列表框没有显示任何结果

时间:2016-04-19 21:20:25

标签: c# visual-studio

我希望我的列表框在visual studio中列出我的课程表中的课程(来自数据库) 应用程序运行正常,但listBox保持为空,这是我使用的代码:

  protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        string sqlcon = "Data Source = localhost; Persist Security Info = True; User ID = localhost; Password = ****; Unicode = True";

        OracleConnection con = new OracleConnection(sqlcon);
        con.Open();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = con;
        cmd.CommandText = "select coursename from course";
        cmd.CommandType = CommandType.Text;
        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();

        while(dr.Read())
        {
            ListBox1.Items.Add(dr.GetString(1));
        }
    }

1 个答案:

答案 0 :(得分:0)

代码中存在三个错误和一些逻辑问题。

错误优先:

  • 您调用read而不对其加载的记录执行任何操作 读取。
  • 当你到达循环代码时,你已经加载了第一条记录,所以while内部的Read只是尝试加载第二条记录。但如果只有一条记录,循环永远不会运行,因此列表中没有项目
  • 你调用GetString(1),但你从中检索了coursename table,这将为索引超出范围提供异常。数组 从索引零开始,以获得你需要的coursename GetString(0)

    // Not needed, let the loop run
    // dr.Read();
    while(dr.Read())
    {
        // The first column is at index zero 
        ListBox1.Items.Add(dr.GetString(0));
    }
    

最后是逻辑问题。您似乎使用SelectedIndexChanged事件来填充触发SelectedIndexChanged的同一列表中的项目。这似乎是不合逻辑的,因为您已经在该列表中有项目,并选择一个触发该事件。这段代码应该在其他地方运行(Load事件?)你在这里想做什么?无论如何,如果你真的想保留这些代码,那么你应该至少在从数据库加载项目之前清除Items集合,否则,在每个SelectedIndexChanged中你添加另一组与已经加载的项目相同的项目。

  // Before filling the items clear the previous ones
  listBox1.Items.Clear();