【问题标题】:ListView returns InvalidArgument=Value of '0' - Out of Range ExceptionListView 返回 InvalidArgument=Value of '0' - 超出范围异常
【发布时间】:2010-05-10 20:24:38
【问题描述】:

我正在尝试使用 ListView 滚动浏览专辑名称数据库。当我最初选择一个专辑时,_SelectedIndexChanged 返回相应的专辑;但是,在随后尝试选择专辑时,ListView 返回 System.ArgumentOutOfRangeException - InvalidArgument=“0”的值对“索引”无效。有人可以指导我如何避免这个错误吗?

private void ScrollThroughAlbums()
    {
      string selectStatement = "SELECT * FROM Albums ORDER BY Artist";
      OleDbCommand selectCommand = new OleDbCommand(selectStatement, oleDatabaseConnectionString);
      OleDbDataReader myReader = selectCommand.ExecuteReader();
      ColumnHeader columnHeader1 = new ColumnHeader();
      ColumnHeader columnHeader2 = new ColumnHeader();
      ColumnHeader columnHeader3 = new ColumnHeader();

      columnHeader1.Text = "Album";
      columnHeader2.Text = "Artist";
      columnHeader3.Text = "Tracks";

      listView1.Columns.Add(columnHeader1);
      listView1.Columns.Add(columnHeader2);
      listView1.Columns.Add(columnHeader3);
      listView1.Columns[0].Width=130;
      listView1.Columns[1].Width=130;

      listView1.View = View.Details;
      listView1.AllowColumnReorder=true;
      listView1.FullRowSelect=true;
      listView1.GridLines=true;
      listView1.MultiSelect = false;
      listView1.Sorting= SortOrder.Ascending;

      while (myReader.Read())
      {
         string frontCoverXML = myReader.GetString(3).ToString();
         string Artist = myReader.GetString(1).ToString();
         string Album = myReader.GetString(2).ToString();
         string TracksXML = myReader.GetString(4).ToString();
         ListViewItem item = new ListViewItem(new []{Album,Artist}); 
         listView1.Items.Add(item); 

        } myReader.NextResult();
        myReader.Close();
    }

   private void listView1_SelectedIndexChanged(object sender,EventArgs e)
   {
      ListView.SelectedListViewItemCollection album = this.listView1.SelectedItems;
      MessageBox.Show(album[0].ToString());
   }

【问题讨论】:

  • 列表视图是什么类型的控件?另外,我会考虑使用 Red Gate Reflector 来检查组件的来源,看看内部发生了什么;可以帮助调试这些问题。

标签: asp.net listview selectedindexchanged outofrangeexception


【解决方案1】:
   private void listView1_SelectedIndexChanged(object sender,EventArgs e)
   {
      ListView.SelectedListViewItemCollection album = this.listView1.SelectedItems;
      if(album.Count>0)
         MessageBox.Show(album[0].ToString());
   }

【讨论】:

  • Volody - 非常感谢您的回复。尽管您建议的语言会识别是否存在错误情况并解决该问题,但我希望确定第二次使用 listview 会首先返回 System.ArgumentOutOfRangeException 错误并更正语言的原因。如果您发现包含的语言有任何问题,请告诉我,并告知您是否应该有任何建议。再次感谢。比尔
  • Volody - 回复您的建议后,我尝试了您建议的语言,发现您的语言可以处理错误(不确定如何,但它可以工作)。感谢您的帮助。比尔
【解决方案2】:

该错误表明事件处理程序在没有选择项目时触发,因此您对专辑 [0] 的调用失败,因为没有项目。在弹出消息框之前检查相册的 count 属性是否大于零。

【讨论】:

  • 本 - 非常感谢您的回复。正如我在上面给 Volody 的说明中所写,我希望确定 OutOfRange 错误的来源并更正语言以希望避免该问题。如果您认为可以对语言进行任何改进,请告诉我。再次感谢。比尔
  • Ben - 我应该在回复之前尝试一下您的建议。事实证明,测试缓解了错误情况(不确定如何)并且代码完美运行。再次感谢你。比尔
  • volody 的解决方案是正确的。 SelectedIndexChanged 事件将在选择更改时触发。 You will get the error whenever the selection changes from something selected to nothing selected.因此,您需要考虑这种可能性,而 volody 的代码会执行此操作,在未选择任何内容时什么也不做。
【解决方案3】:

这是因为,在幕后,在从一个项目切换到另一个项目时,实际上调用了 3 次选定的索引更改事件。第一个项目 A 被选中,然后没有项目,然后是项目 B。在每个阶段维护引用的索引项目的计数。在中间步骤中,索引计数为 0,因此在索引检查中没有可参考的内容。试图引用它会返回错误。检查计数会跳过中间步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2014-11-12
    • 2014-03-06
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多