工作笔记(二)

1.TreeView 中如何根据 Node名得到index

 

Tv1.Name="节点1";

Tv1.Nodes[节点1].Checked = true;// 在遍历的时候就不会引发index下标越界的错误了,特别是多次遍历集合的时候

,这样就可以避免越界了,直接根据赋值的Name名称来给Checked赋值;

2.移除字符串中的相同字符

 

string str = "1,22,333,4,5,1,22,333,6,7,";//要拆分的字符串   
ArrayList al = new ArrayList();   
string[] arr = str.Split(',');//拆分后的字符数组   
  
for (int i = 0; i < arr.Length; i++)   
{   
    if (al.Contains(arr[i]) == false)//判断 要拆分的字符串 中是否已经存在于这个ArrayList中   
    {   
        al.Add(arr[i]);//不存在则添加进ArrayList   
    }   
    else  
    {    break;// 删除一个重复字符
        //al.Remove(arr[i]);//存在则从ArrayList中删除2个   
    }   
}   
Response.Write(String.Join(",",(string[])al.ToArray(typeof(string))));//把ArrayList里的数组值组合成一个字符串   

 

3. 如何在TreeView里面 勾选Checked,且放入ArrayList,并且根据Combobox加载树中的所选分区列表;

 

根据tv里的AfterCheck事件得到每次勾选的Checked的记录值,

if(e.Node.Checked)

{

   if(!arrList.Contains(e.Node.Name))

      {

          arrList.Add(e.Node.Name);

       }

}

 else

  {

      if(arrList.Contains(e.Node.Name)) 

        {

            arrList.Remove(e.Node.Name);

         }

   }

 

这样,arrList里面存放的就是当前勾选的值了。也就是说,你选择就存入ArrayList,否则就不存。

以下代码是根据通道列表遍历所选分区:

private void RepeatForChannels()

{

  for(int i= 0 ; i< 通道列表; i++)

   {

     for(int j= 0; j < treeView.Nodes.Count; j++)

     {

        for(int jj=0 ; jj < arrayList.Count; jj++)

         {

           if(treeView.Nodes[j].Name == arrayList[jj].Tostring())

             {

                 treeView.Nodes[j].Checked = true;

              }

         }

      }

   }

}

把RepeatForChannels放入Form_Load和 Combobox_SelectIndexChanged事件中,每次就可以把所选的分区列表根据通道来显示出来了。

 

 4.C#多线程强制退出程序
最近在学习多线程程序的开发,但是启动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常,因此这样不行。
后来找到了这个办法:
Thread.IsBackground 设置线程为后台线程。
msdn 对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
所以解决办法就是在主线程初始化的时候,设置:
Thread.CurrentThread.IsBackground = true;
这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。
但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。

——————————————


C#程序的几种退出

1.Application.Exit(); //好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵
2.System.Environment.Exit(0); //无论在主线程和其它线程,只要执行了这句,都可以把程序结束干净
3.this.Close();
4.Application.ExitThread();

 

5. Treeview中的图标不能正常显示

XP系统中,使用Application.EnableVisualStyles后,Treeview中的图标不能正常显示!

 

this.TreeView.BeginUpdate();

//处理操作

//this.TreeView.EndUpdate();

 

这样TreeView出来之后节点就不会显示不全了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值