●难道是微软的经典错误???

foolfool 2004-07-09 10:05:38
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WinAPP01
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.TextBox textBox1;
private ArrayList myListData = new ArrayList();
private System.Windows.Forms.Button btnADD;
private System.Windows.Forms.Button btnDEL;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.textBox1 = new System.Windows.Forms.TextBox();
this.btnADD = new System.Windows.Forms.Button();
this.btnDEL = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// listBox1
//
this.listBox1.ItemHeight = 12;
this.listBox1.Location = new System.Drawing.Point(225, 40);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(151, 268);
this.listBox1.TabIndex = 0;
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(26, 42);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 1;
this.textBox1.Text = "textBox1";
//
// btnADD
//
this.btnADD.Location = new System.Drawing.Point(132, 43);
this.btnADD.Name = "btnADD";
this.btnADD.TabIndex = 4;
this.btnADD.Text = "添加";
this.btnADD.Click += new System.EventHandler(this.btnADD_Click);
//
// btnDEL
//
this.btnDEL.Location = new System.Drawing.Point(229, 326);
this.btnDEL.Name = "btnDEL";
this.btnDEL.TabIndex = 5;
this.btnDEL.Text = "删除";
this.btnDEL.Click += new System.EventHandler(this.btnDEL_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(689, 441);
this.Controls.Add(this.btnDEL);
this.Controls.Add(this.btnADD);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.listBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{

}



private void btnADD_Click(object sender, System.EventArgs e)
{
myListData.Add(new listData(textBox1.Text,"VALUE"));
listBox1.DataSource=null;
listBox1.DataSource=myListData;
listBox1.DisplayMember="strTXT";
listBox1.ValueMember="strVAL";
}

private void btnDEL_Click(object sender, System.EventArgs e)
{
myListData.Remove(listBox1.SelectedItem);
listBox1.DataSource=null;
listBox1.DataSource=myListData;
listBox1.DisplayMember="strTXT";
listBox1.ValueMember="strVAL";
//listBox1.SelectedIndex=-1;

}


}

//==============================================

public class listData
{
private string myTXT;
private string myVAL;
public listData (string txt,string val)
{
this.myTXT =txt;
this.myVAL=val;
}
public string strTXT
{
get
{
return myTXT;
}
}
public string strVAL
{
get
{
return myVAL;
}
}

}
}






在Windows窗体中有一个listBox1,一个textBox1 和两个按钮,
一个按钮把textBox1中的内容添加到listBox1中(用ArrayList变量);
这个没有问题。

另外一个按钮删除listBox1中所选的当前项,如果删除的项不是最后一项时也
没有任何问题。

可是

当删除最后一项之后(listBox1中有多于1个的项)
再用光标去点击选择listBox1中的项目时

经典错误发生:

未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 mscorlib.dll 中。

其他信息: 索引超出范围。必须为非负值并小于集合大小。




?????????????????????????


...全文
1089 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
foolfool 2004-07-12
  • 打赏
  • 举报
回复
看来还有很多其他的方法,还想多学点东西。。
再等等!
comy 2004-07-10
  • 打赏
  • 举报
回复
应该是使用的经典错误



----------------------------------------------------------------------
欢迎试用ASP.NET大文件上传组件(AspnetUpload 1.0 Release & 无刷新进度条)
http://bestcomy.europe.webmatrixhosting.net
----------------------------------------------------------------------
cjzlxy 2004-07-10
  • 打赏
  • 举报
回复
for(int i=Items;i>0;i--)
{
}
foolfool 2004-07-10
  • 打赏
  • 举报
回复
楼上的兄弟,你能知道是使用上的错误,
可否把正确的用法,写出来,让大家分享,多谢先!
ji2feng 2004-07-10
  • 打赏
  • 举报
回复
!!!!!!!
caomj 2004-07-09
  • 打赏
  • 举报
回复
设断点跟踪一下
北京的雾霾天 2004-07-09
  • 打赏
  • 举报
回复
是你的代码的执行顺序问题
melonlee 2004-07-09
  • 打赏
  • 举报
回复
GZ
xinshaw 2004-07-09
  • 打赏
  • 举报
回复
其实你没有必要每添加或删除一次都重新绑定一次,这样会造成不必要的刷新。
你只需要在List中添加一项,或删除选定项即可
foolfool 2004-07-09
  • 打赏
  • 举报
回复
to : gkwww(奔放)

差不多,知识删除之后就马上重新绑定,看上面的代码!!!


to : xinshaw(清瘦卫郎)

错误的断点在:下面的最后一个符号 “}”
问题是错的没有什么理由!!!

static void Main()
{
Application.Run(new Form1());
}
xinshaw 2004-07-09
  • 打赏
  • 举报
回复
你的程序中应该加个判断,不是微软件的错,是你自己的错
gkwww 2004-07-09
  • 打赏
  • 举报
回复
你选中的是最后一行。但随之你又将它删除。

listBox的SelectIndex已经没有了。
删除后向上移一项,再绑定(仅最后一项时。)
所以报错。不知是不是这样。
foolfool 2004-07-09
  • 打赏
  • 举报
回复
从道理上讲,本来把 listBox1 与 数据源断开后。
重新绑定,也就是listBox1 应该相当 第一此绑定,也就不应该出现改错误!
但我弄不明白其中的缘由,,,多谢 longx 赐教!!!
下周结贴!
foolfool 2004-07-09
  • 打赏
  • 举报
回复
多谢 longx ,
让咱学到东西了!!!


longx 2004-07-09
  • 打赏
  • 举报
回复
有仔细看了一下,引起错误的原因是: SelectedIndex 属性必须是一个有效的值 ,即必须在好面的 datasource 中存在,所以设置 -1 会失败,但是有一个奇怪的事情:调用 ClearSelected()方法之后, SelectedIndex 值却是 -1,在一个单独的button 事件中调用 ClearSelected()没有问题,放在上面的 Detele 事件代码中调用却有问题
看样子还是 microsoft 的 bug,
longx 2004-07-09
  • 打赏
  • 举报
回复
看样子是 microsoft 一个有关使用 datasource 的 bug
我稍微改了一点代码实现你想要的功能,绕过这个bug

private void setListDataSource()
{
ArrayList lvArrayList = new ArrayList();
lock (myListData.SyncRoot)
{
foreach (Object item in myListData)
{
lvArrayList.Add(item);
}
}
listBox1.DataSource = lvArrayList;
listBox1.DisplayMember = "strTXT";
listBox1.ValueMember = "strVAL";
}
private void btnADD_Click(object sender, System.EventArgs e)
{
myListData.Add(new listData(textBox1.Text, "VALUE"));
setListDataSource();
}
private void btnDEL_Click(object sender, System.EventArgs e)
{
myListData.Remove(listBox1.SelectedItem);
setListDataSource();
}
BillKang 2004-07-09
  • 打赏
  • 举报
回复
你可以跟踪一下重新绑定数据源后listBox1.SelectedIndex的值(不要手工设定)
chido 2004-07-09
  • 打赏
  • 举报
回复
虽然微软的产品有漏洞,但是所有软件都有漏洞,
一般情况下,不要怀疑计算机会出错,也不要怀疑微软会出错,
应该先怀疑自己。
foolfool 2004-07-09
  • 打赏
  • 举报
回复
多谢

BillKang(寂寞惯了)


了!!!



int i =listBox1.SelectedIndex;
listData ld=(listData)listBox1.SelectedItem;
if (i==myListData.Count-1)
listBox1.SelectedIndex=myListData.Count-2;
myListData.Remove(ld);
listBox1.DataSource=null;
listBox1.DataSource=myListData;
listBox1.DisplayMember="strTXT";
listBox1.ValueMember="strVAL";

就没有问题,而且还很符合删除后的记录移动。


只是 listBox1 在用 listBox.DataSource =null;
之后再重新绑定,按道理上讲 就不应该出现这样的错误。。。。。
是否listBox1和一个数据源绑定之后,背后还有什么机制
哪位给予指点???


longtusoft 2004-07-09
  • 打赏
  • 举报
回复
不要轻易怀疑M$.
加载更多回复(10)

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧