作者andymai (人生只有一次)
看板C_Sharp
标题Re: [问题] 问一个listbox的新手问题
时间Tue Jun 15 19:35:13 2010
※ 引述《kevin8685 (最爱maki~!)》之铭言:
: 以下是我修改过後的
: 删除按钮
: 目前有个问题
: 执行後 可以成功进行第一次删除
: 但是第二次就会卡住..
: 重开程式後 还是一样
: 第一次成功 第二次卡住
: private void button1_Click(object sender, EventArgs e)
: {
: dt.Clear();
: ListBox.SelectedIndexCollection sic =
: this.listBox1.SelectedIndices;
: StreamReader item = new StreamReader("product.txt",
: Encoding.UTF8);
: while (!item.EndOfStream)
: {
: string[] item2 = item.ReadLine().Split(' ');
: dr = dt.NewRow();
: dr["Key"] = item2[0];
: dr["Value"] = item2[1] + " " + item2[2];
: dt.Rows.Add(dr["Value"], dr["Key"]);
: }
: item.Close();
: int count = listBox1.SelectedItems.Count;
: if (count > 1)
: {
: if (sic.Count == 0)
: {
: MessageBox.Show("您没有选取任何项目。");
: }
: else
: {
: for (int i = 0; i < sic.Count; i++)
: {
: list.Add(sic[i]);
: }
: list.Sort();
: for (int j = 0; j < sic.Count; j++)
: {
: int a = list[list.Count - (j + 1)];
: dt.Rows.Remove(dt.Rows[a]);
: MessageBox.Show(a.ToString());
: }
: }
: }
: StreamWriter sw = new StreamWriter("product.txt");
: for (int i = 0; i < dt.Rows.Count; i++)
: {
: sw.WriteLine(dt.Rows[i]["Key"].ToString() + " " +
: dt.Rows[i]["Value"].ToString());
: }
: sw.Close();
: BindingSource bs = new BindingSource();
: bs.DataSource = dt;
: listBox1.DataSource = bs;
: listBox1.DisplayMember = "Value";
: listBox1.ValueMember = "Key";
: dt.AcceptChanges();
: }
:
之所以把listBox1的项目存在记事本~是想要把它当成资料库用?
可以在关闭程式後储存?
个人认为在Form_Load阶段把listBox1的项目读进来就好了
不需要在按下删除按钮时又把记事本的内容读进来
另外SelectedIndices和SelectedItems就这边的需要来说~用其中一个就好了
以下是我改过可以跑的程式:
if (sic.Count == 0)
{
MessageBox.Show("您没有选取任何项目");
}
else
{
//原本我也以为底下这个把选取项目指标存起来的动作是多余的
//实作後才知道似乎是有这个必要
for (int i = 0; i < sic.Count; i++)
{
list.Add(sic[i]);
}
BindingSource bs1 = listBox1.DataSource as BindingSource;
for (int j = sic.Count - 1; j >= 0; j--)
{
bs1.RemoveAt(list[j]);
//假设在listBox1选取多项
//在移除项目之後,原本纪录多项的sic会跟着变动,但不规则
//我观察到的现象是选3个,移除1个後,却只剩下1个...囧
//所以只好用list先把选到的指标存起来,在移除时取用
//原po似乎也观察到不能从前面开始移除,否则移除1个过後
//剩下的指标就不正确了,所以要从後面开始移除
}
//原po忘了清除这个全域变数list,下次再删除就...
//实际上我认为list的生命周期应该只活在这个事件
//不应该弄成全域变数,稍不注意就会造成未预期的结果
list.Clear();
}
StreamWriter sw = new StreamWriter("product.txt");
DictionaryEntry a;
for (int i = 0; i < listBox1.Items.Count; i++)
{
a = (DictionaryEntry)listBox1.Items[i];
sw.WriteLine(a.Key.ToString() + " " + a.Value.ToString());
}
sw.Close();
另外...要不是原po有寄程式码给我
我想可能又会再上来问为什麽全部删除再加入一个项目後就不能用了...
原因在於"加入"这个事件里~写入记事本那段~一开头就给它Environment.Newline
那程式下次再执行~一开头就跑到那段~自然就挂点了
这个的解法~个人会倾向於在写入时就写入正确的资料
而不会让它写入空白後~再写一堆程式去防...
By the way...其实这些东西~Trace一下就看得出来死在哪了...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.15.180.2
※ 编辑: andymai 来自: 163.15.180.2 (06/15 19:36)
1F:推 kevin8685:感谢A大!! 昨天还给我了不少帮助^^ 我会在努力XD 06/16 00:08