C#list<T>泛型集合习题

在做了前面的演练7-3之后,我以为后面的习题应该问题不大,依样画葫芦也能弄出来,结果说明,我想多了,两个不容的控件完全不能一概而论。前面用的时DataGirdView,后面则是的listview。对于这个玩意,我应该不陌生,在前面的动态控件,做图片轮显的时候就遇到,当时还没有搞出来。网上说做数据表现和存放用DataGirdView是比较好的,再加上我对C#的控件不是特别熟悉,很多都不会用,所以在listview上花了一些时间去了解它的用法。
        OK,言归正传,首先要使用这个listview控件,就必须了解它是如何往里面添加行列的,如何显示出来。当初我试想跟着演练照着来,结果发现listview没有直接布局的方法,不能像DataGirdView直接给column命名,不能直接通过BindingSource绑定数据源。所以只能按照它给定的其他属性和方法来弄。
    
1.定义一个列名,并把这个列添加到listview里面
        ColumnHeader ch = new ColumnHeader();
            ch.Text = "姓名";
            ch.Width = 120; 
        this.listview_show_hgy.Columns.Add(ch);

2.然后添加一个Item(首项),和若干的SubItem(子项)
         lvi.Text = list[i].Name;//!!!
          lvi.SubItems.Add(list[i].Chinese);
        this.listview_show_hgy.Items.Add(lvi); 
        在上面的代码里有一个i,是因为要添加的不可能只有一项,所以用循环的方式,i< list.count,在这里也要忍不住      吐槽一下,存储的方式使用list,当时想了好久怎么把list中存放的数据读出来,结果两个小时过了,试了若干方      法,结果是,实例名.属性 的方法,瞬间感觉不好了。
    
3.最后将listview设置成Details模式即可
         this.listview_show_hgy.View = System.Windows.Forms.View.Details; 
      
        到这里,一个list就建好了,是不是很简单,
接着在窗体载入时给list放一个自定义类的对象集合进去就行了,就像这样
               
        StuInfo zhang = new StuInfo("张三", "80", "95", null, "河南省郑州市", "13323456789");
        stulist.Add(zhang);
        FillGrid(stulist);    //在FillGrid方法中显示listview

        接着就是按钮的事件问题了,这里有几个困惑我的难点:
        1.点击主窗体“添加”,隐藏主窗体,显示副窗体
        2.点击副窗体的“添加”,给主窗体的listview添加一条记录
        3.点击副窗体“返回”,隐藏副窗体,显示主窗体,这时候,主窗体要有之前添加的记录
        4.点击主窗体“删除”,删除listview一条记录

        ①这里面最好解决的是4,之前我用list的romove方法没有搞出来,网上查了下原来是要这么用

        //判断listview有被选择的项
            if (listview_show_hgy.SelectedItems.Count > 0)
            {
                //取得当前选中项的index
                int index = listview_show_hgy.SelectedItems[0].Index; 
                listview_show_hgy.Items[index].Remove();
            } 

         ②当时我做完前面所有的步骤的时候,还感觉良好,没什么问题,结果耗时最多的就是窗体之间传递参数的问题
                在网上找了好多的资料,看到的方法也都有几种,但是实际操作起来都不适用,大多数时在主窗体里new一个 
                 副窗体,然后用副窗体的实例对象去访问副窗体的属性,不过在new的同时,会把之前的记录重置,也就是第
                3个难点没办法完成。好在晚上11点过,认真看了一下关于委托传参的方法 ,结果出乎意料,完美解决。
               
                1)首先在副窗体里声明委托事件(实际上是一个类,然后定义了一个传参的方法)
                     public MyDelegate myDelegate;
                    public delegate void MyDelegate(string name, string chinese, string math, 
                                                        string total, string address, string tel);
                
                2)然后在副窗体的“添加”按钮中,调用MyDelegate方法,把副窗体的几个文本值传递给主窗体
                         myDelegate(this.text_name_hgy.Text, this.text_chinese_hgy.Text, this.text_math_hgy.Text, total,
                                              this.text_address_hgy.Text, this.text_tel_hgy.Text);

                3)最后在主窗体里接受传递来的参数,先定义一个Add方法,就是把传来的值添加到listview中
                    然后在按钮中注册委托事件,看到Form里面的this没有,那个东西就是解决难点1的钥匙

                    Form16 form = new Form16(this);           
                    form.myDelegate += new Form16.MyDelegate(Add);

                public void Add(string name, string chinese, string math, string total, string address, string tel)
                    {
                        this.listview_show_hgy.Items.Add(name);
                        this.listview_show_hgy.Items[listview_show_hgy.Items.Count - 1].SubItems.Add(chinese);
                       } 
                    Add方法里要说的就是Item下标的问题, -1是因为之前的name已经占了一行的第一个位置。

           ③最后一个难点也是我在完成上面的步骤后,遇到的,就是窗体的隐藏问题,当然也是参照网上
                        的资料弄出来的
                        
                        主窗体: 
                        Form16 form = new Form16(this);
                            form.Show();
                            this.Hide(); 
                        
                         副窗体 :先定义一个Form对象parent,然后在构造函数传递一个Form窗体对象,这时这个
                                           parent就变成咱们的主窗体啦
 
                         private Form parent;
                         public Form16(System.Windows.Forms.Form f)
                           {
                                InitializeComponent();
                                this.parent = f;
                            }
                        
                            最后在返回按钮中加入一样三行代码,就大功告成了。
                            
                            this.Close();
                            parent.Show();                       

        最后我还给这个习题加了一个检查输入的合法性,做的很简陋,只能判断输入的语文,数学成绩,电话号码是不是double和int型。不过能完成心里也是很愉快的。而之所以,我要用一个小时去把这些写下来,是因为我在完成这次作业,也就是昨天,用了一天多的时间去做,去想,把那个时候做这样很小的case的经历和感想写一写,下次在遇到这样的问题,也知道该如何去完成,而不至于再花费一天的时间了。(Ps,这个空间的排版实在太差了!各位就将就看吧) 

time:12:55

        当我以为大功告成准备去上课的时候,发现一个bug!!!,对我来说完全不能忍!所以又开始长达2个小时的debug之旅,还好vs2012的debug比我想象中好用。

bug:点击姓名弹出信息后,再点添加按钮,弹出副窗体后,再点返回按钮,这时之前弹出的信息会再次弹出来!

debug:根据vs2012我在 3个位置设了断点:
                主窗体:
                ①  private void listview_show_hgy_SelectedIndexChanged(object sender, EventArgs e) {} 
                ②  private void btn_add_hgy_Click(object sender, EventArgs e){}
                副窗体:
                ③  private void btn_back_hgy_Click(object sender, EventArgs e){}

原因: 在点击完listview后,会把①事件中sender传递个②,然后当③事件中的parent.Show()发生时,sender还是①的事件
            所以才会在parent.Show()发生后,直接跳转到 ①里面去,再次执行里面的messbox.Show();弹出信息

解决办法:当用户点击添加时,检查listview是否被选中,进行判断,如果选中则return 禁止打开另一个窗体。同时,当用户                     选中后,用一条语句将选中状态清除,使用户能不用再次点击listview其他位置取消选中,直接进行添加操作。
code: 
             int selectCount = listview_show_hgy.SelectedItems.Count;
            if (selectCount > 0)
            {
                MessageBox.Show("无法在选择状态添加! ", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //取消listview选中的item项,使其什么都不选中
                listview_show_hgy.SelectedItems.Clear();
                return;
            }

time:13:10


程序部分截图:
 

图片


图片


图片


图片


图片


图片


图片


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值