zoukankan      html  css  js  c++  java
  • C# 两个ListBox 数据互传-基础操作

    先看效果图:

     

    两个服务设施列,左边:lbFacility1,右边:lbFacility2,中间向左向右箭头。

    如果只是单纯的向左向右移动,那很简单。

    因为项目遇到要获取选中项的ID,通过给ListBox绑定DataSource可以绑定,但问题是获取怎么获取?

    ListBox 绑定数据源 DataSource 方法:

    DataSet ds = GetData();   //GetData() 方法获取的是服务设施的是包含 ID,Name 的DataSet

    lbFacility1.DataSource = ds.Tables[0];

    lbFacility1.DisplayMember = "FACILITYS_NAME";

    lbFacility1.ValueMember = "FACILITYS_ID";

    以上绑定完数据之后,要移动到lbFacility2,就需要判断重复,首先我想到的就是直接通过Item比较,或者通过获取lbFacility1的DisplayMember值或ValueMember值来比较,但试了试,发现很难获取的到(本人技术有限),后来无意中发现加载到lbFacility2中的项显示为System.DataRowView什么什么的,才有了这个判断方法。

    ListBox 判断数据是否重复方法:

    lbFacility1》》lbFacility2

    if (lbFacility1.SelectedItems.Count != 0)

                    {

                        //lbFacility1选中的行

                        DataRowView drv1 = (DataRowView)lbFacility1.SelectedItem;

                        for (int i = 0; i < lbFacility2.Items.Count; i++)

                        {

                            //lbFacility2选中的行

                            DataRowView drv2 = (DataRowView)lbFacility2.Items[i];

                            //通过对比选中行名称判断是否重复

                            if (drv1.Row[1].ToString()==drv2.Row[1].ToString())

                            {

                                MessageBox.Show("数据重复,不能添加!");

                                return;

                            }

                        }

                        //如果不重复,添加到 lbFacility2

                        lbFacility2.Items.Add(lbFacility1.SelectedItem);

                        lbFacility2.DisplayMember = "FACILITYS_NAME";

                        lbFacility2.ValueMember = "FACILITYS_ID";

                    }

    lbFacility2《《lbFacility1

    if (lbFacility2.SelectedItems.Count != 0)

                    {

                        lbFacility2.Items.RemoveAt(lbFacility2.SelectedIndex);

                    }

    添加时候通过全局变量接受DataRowView

    private List<DataRowView> facilitys = new List<DataRowView>();

     

    for (int i = 0; i < lbFacility2.Items.Count; i++)

                    {

                        DataRowView dr = (DataRowView)lbFacility2.Items[i];

                        facilitys.Add(dr);

                    }

    这里数组为什么用DataRowView 接收?看了数据插入的SQL就明白了

    for (int i = 0; i < Facilitys.Count; i++)

                {

                    int facilityID = Int32.Parse(Facilitys[i].Row[0].ToString());

                    string strSql1 = string.Format("insert into h_hotels_facilitys values({0},{1})", facilityID, hotelsId);

                    result += dbAccess.ExecuteNonQuery(strSql1, CommandType.Text, null);

                }

    前面说到ListBox的键值对不好取,在这里用DataRowView就很好的解决了问题,

    int facilityID = Int32.Parse(Facilitys[i].Row[0].ToString());

    为什么用Row[0],不用Row[1],是因为我的SQL查询语句是

    select facilitys_id,facilitys_name from h_facilitys,第0列是ID,第1列是Name。

     

    以上是我做的添加服务设施时候遇到的困难及解决方法,编辑时候也不好解决的问题呢?

    编辑界面加载的时候必须分别查出来lbFacility1里面的项和lbFacility2(因为上面已将酒店的服务设施添加到数据库)里面的项,用到的方法当然还是通过绑定数据源绑定数据。也就是说添加的时候只需要绑定lbFacility1,但编辑的时候两个都要绑定。

    两个都要绑定,问题就来了

     

    也就是说设置了DataSource之后就不能左移有移了。郁闷ing….

    又经过一番研究,用了个笨方法解决了,看完下面的图就明白了

     

    没错,给加了一个temp,加载的时候查询出来赋值给lbFacility1和lbFacility3,然后把lbFacility3的值再赋给lbFacility2,这样lbFacility2就没有绑定数据源,也就可以移动了。

    //酒店对应设施 设置了DataSource                  //设置了DataSource后救不能移动了,所以给加了一个temp

     

                //系统所有的服务设施

                lbFacility1.DataSource = ds.Tables[0];

                lbFacility1.DisplayMember = "FACILITYS_NAME";

                lbFacility1.ValueMember = "FACILITYS_ID";

                lbFacility3.DataSource = ds.Tables[0];

                lbFacility3.DisplayMember = "FACILITYS_NAME";

                lbFacility3.ValueMember = "FACILITYS_ID";

                // lbFacility3的值赋给lbFacility2

                for (int i = 0; i < lbFacility3.Items.Count; i++)

                {

                    DataRowView drv = (DataRowView)lbFacility3.Items[i];

                    lbFacility2.Items.Add(drv);

                    lbFacility2.DisplayMember = "FACILITYS_NAME";

                    lbFacility2.ValueMember = "FACILITYS_ID";

                }

    那在Update的时候,就需要根据传入的ID对应到不同的酒店修改服务设施,这在数据访问层判断也比较麻烦,你得知道那个服务设施是新增的,哪个是原有的,哪个又是去掉的,这个我想SQL语句里面应该能写出来,但是可能会要求比较高,既然写不出来,那就继续用笨办法,插入数据库之前,我先把这个酒店对应的所有服务设施全部删除掉

    string strSql = string.Format("delete from h_hotels_facilitys where hotels_id = {0}", hotelsId);

    再重新对应酒店ID插入lbFacility2里面的数据

    for (int i = 0; i < Facilitys.Count; i++)

                {

                    int facilityID = Int32.Parse(Facilitys[i].Row[0].ToString());

                    string strSql1 = string.Format("insert into h_hotels_facilitys values({0},{1})", facilityID, hotelsId);

                    result += dbAccess.ExecuteNonQuery(strSql1, CommandType.Text, null);

                }

    这样做就是基础设施表的ID会改变,至于有没有什么影响,就要看数据库的设计了。

  • 相关阅读:
    【LeetCode每日一题】2020.6.28 209. 长度最小的子数组
    【《你不知道的JS(中卷①)》】三、原生函数
    【《你不知道的JS(中卷①)》】二、值
    【《你不知道的JS(中卷①)》】一、类型
    【LeetCode每日一题】2020.6.26 面试题 02.01. 移除重复节点
    【LeetCode周赛】第194场周赛
    【LeetCode每日一题】2020.6.25 139. 单词拆分
    ios网络编程(HTTP socket)
    objective c 代码块blocks完整总结二
    objective c 代码块blocks完整总结一
  • 原文地址:https://www.cnblogs.com/xw-yanger/p/3375397.html
Copyright © 2011-2022 走看看