先看效果图:

两个服务设施列,左边: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会改变,至于有没有什么影响,就要看数据库的设计了。

C# 两个ListBox 数据互传-基础操作的更多相关文章

  1. 两台Linux主机互传文件可以使用SCP命令来实现

    当两台linux主机之间要互传文件时可使用SCP命令来实现 复制文件: (1)将本地文件拷贝到远程 scp 文件名 --用户名@计算机IP或者计算机名称:远程路径 (2)从远程将文件拷回本地 scp ...

  2. MultCloud – 支持数据互传的网盘管理

    MultCloud https://www.multcloud.com/ 是一款在线服务,可以在一个地方管理众多网盘,支持国产百度盘, 最具有特色的地方是你可以直接在 MultCloud 里操作将 D ...

  3. 非常简单的oracle和mysql数据互传

    工具是navicat,我用的是Navicat Premium 10: 这个工具可以同时连接mysql和oracle,如图: 同时连接上这两个库之后 工具->数据传输 左边是数据源,右边是导入目标 ...

  4. Linux Windos数据互传软件安装

    一.编译安装 root 账号登陆后,依次执行以下命令: cd /tmp wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz tar zx ...

  5. Linux两台服务器上互传文件

    主服务器:192.168.100.30: 文件所在服务器:192.168.100.31: 1. 在主服务上拷贝文件: #scp root@192.168.100.31:/home/a.txt /hom ...

  6. Linux本地数据上传到阿里云OSS

    这篇文章主要是介绍如何将服务器本地的数据上传到阿里云OSS的指定bucket中,最重要的参考文档是数据迁移单机部署.我第一次上传数据到OSS上时,步骤要比前面的链接中介绍的要麻烦,ossimport工 ...

  7. 两台linux之间建立信任关系,实现免密码ssh远程登录或scp数据上传

    两台linux之间建立信任关系,实现免密码远程登录或数据上传 1.执行ssh-keygen命令,生成建立安全信任关系的证书: linux1上:执行命令  ssh-keygen  -t rsa 在程序提 ...

  8. 如何优化 FineUI 控件库的性能,减少 80% 的数据上传量!

    在开始正文之前,请帮忙为当前排名前 10 唯一的 .Net 开源软件 FineUI 投一票: 投票地址: https://code.csdn.net/2013OSSurvey/gitop/codevo ...

  9. 解密 Uber 数据团队的基础数据架构优化之路

    如果你用过Uber,你一定会注意到它的操作是如此的简单.你一键叫车,随后车就来找你了,最后自动完成支付,整个过程行云流水.但是,在这简单的流程背后其实是用Hadoop和Spark这样复杂的基础大数据架 ...

随机推荐

  1. 制作复选框(Toggle)

    怎样判断是否应当使用复选框 复选框,就是对一个选项做上一个标记,表示这个选项已经被选中了.在游戏中,复选框一般用来做一些选项的控制,这种选项一般都只有两种答案:是和否.例如,单击一下开启音乐的复选框, ...

  2. submit与button区别提交区别

    提交表单时使用submit会自动提交form表单数据, 如果使用jquery的form表单插件时需要将提交按钮改为button时$("#表单id").ajaxSubmit({}); ...

  3. Python系统调用——运行其他程序

    转载:http://blog.csdn.net/ssihc0/article/details/7738527 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其 ...

  4. Linux的安装 CentOS-7.1

    说明: 首先,版本:7.1版:CentOS-7-x86_64-Everything-1503-01.iso 下载自:http://mirrors.163.com/centos/7/isos/x86_6 ...

  5. [JavaScript] js 判断闰年

    /** * 判断闰年函数 * @param {number} year 要判断的年份 * @return {bool} 返回布尔值 * * 其实只要满足下面几个条件即可. * 1.普通年能被4整除且不 ...

  6. js数组反转

    var _li = test.getElementsByTagName("li"), arrayObj = [].slice.apply(_li),//_li用apply调用sli ...

  7. Recommender Systems 基于知识的推荐

    前两章的协同过滤和就内容的推荐都建立在“大量数据”的基础上,运用概率方法来进行计算和预测.不过,在现实生活中,有些物品,如:汽车.房屋.计算机,用户不会频繁的消费.如何在这种情况下对用户进行推荐? 这 ...

  8. js和HTML结合(补充知识:如何防止文件缓存的js代码)

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(二) 使用html标签<script>可以把js嵌入到html页面中,让脚本 ...

  9. [转载]vs2012中使用Spring.NET报错:Spring.Context.Support.ContextRegistry 的类型初始值设定项引发异常

    学习使用Spring.NET中的时候,写了一个Demo,在运行时报了一个错误:Spring.Context.Support.ContextRegistry 的类型初始值设定项引发异常. 重新整理思绪, ...

  10. PAT-乙级-1025. 反转链表 (25)

    1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数K以及一个单链表L,请 ...