
热爱新技术,喜欢专研,目前了解范围:.net,C#,Xamarin.Android,MySQL,SQL Server,HTML,Linux,Python
最近做一个项目,web端使用百度地图,PDA使用手持机自带的GPS定位系统获取经纬度,然后再百度地图上显示该经纬度会有一定距离的差异,这里就像可乐的瓶子拧上雪碧的盖子,能拧的上却不美观。所以为了数据的精确性,PDA端也用百度地图的接口。 下面主要流程分为以下几步: 新建项目BaiduMapAPIDemo。 下载百度地图 --Android定位SDK 。 Binging Labrary项目添加相关文件。 注册百度开发平台,创建应用,获取AK。 写入百度提供示例代码。 查看输出结果。 第一步:新建项目名为BaiduMapAPIDemo的项目 解决方案右键——> 添加 ——> 新建项目 ——> 绑定库,名为BaiduMapAPI 添加后呈现效果: 第二步:下载百度地图 Android定位SDK http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all 下载后的呈现效果: 第三步:在Jars文件夹下添加jar文件,并将jar文件的生成操作改为Embedded 重新生成马上就会报这个错误: 只需要打开项目BaiduMapAPI - Transforms文件夹 修改Metadata.xml文件为以下,就不会生成错误。 <metadata> <attr path="/api/package[@name='com.baidu.location']/class[@name='Address']/field[@name='address']" name="name">Addresses</attr> </metadata> 把下载的libs文件粘贴到Assets文件夹下,并将so文件的生成操作修改为AndroidNativeLibrary 项目中呈现效果: 然后对BaiduMapAPI添加引用 第四步:获取访问应用(AK) http://lbsyun.baidu.com/apiconsole/key/create SHA1获取方式: 找到本机的Mono for Android的地址,我的是 C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android 然后cmd命令行输入:cd /d C:\Users\Adminsistrator\AppData\Local\Xamarin\Mono for Android 然后再输入 keytool -list -v -keystore debug.keystore 然后就能获取SHA1了 输入秘钥库口令直接空格可跳过。 包名获取方式:AndroidManifest.xml 下的package中的值就是包名 百度AK创建呈现 第五步:在Android项目中的AndroidManifest.xml文件中进行以下配置: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="BaiduMapAPIDemo.BaiduMapAPIDemo" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="21" /> <application android:allowBackup="true" android:label="@string/app_name"> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="VsuhUI11WpW2kF" /> //key:开发者申请的Key </application> <!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> </manifest> 在MainActivity.cs中引入Com.Baidu.Location , System.Text,并实现接口IBDLocationListener。 using System; using Android.App; using Android.OS; using Com.Baidu.Location; using System.Text; using Android.Locations; using System.Collections.Generic; using Java.Util; namespace BaiduMapAPIDemo { [Activity(Label = "BaiduMapAPIDemo", MainLauncher = true)] public class MainActivity : Activity, IBDLocationListener { int count = 1; public LocationClient mLocationClient = null; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); mLocationClient = new LocationClient(ApplicationContext); //声明LocationClient类 mLocationClient.RegisterLocationListener(this); //注册监听函数 StartLocationService(); } private void StartLocationService() { LocationClientOption option = new LocationClientOption(); option.SetLocationMode(LocationClientOption.LocationMode.HightAccuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.CoorType = "bd09ll";//可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.ScanSpan = span;//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.SetIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.OpenGps = true;//可选,默认false,设置是否使用gps option.LocationNotify = true;//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 option.SetIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.SetIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.SetIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.EnableSimulateGps = false;//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要 mLocationClient.LocOption = option; mLocationClient.Start(); } public void OnReceiveLocation(BDLocation location) { StringBuilder sb = new StringBuilder(); sb.Append("time : "); sb.Append(location.Time); sb.Append("\nerror code : "); sb.Append(location.LocType); sb.Append("\nlatitude : "); sb.Append(location.Latitude); sb.Append("\nlontitude : "); sb.Append(location.Longitude); sb.Append("\nradius : "); sb.Append(location.Radius); if (location.LocType == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.Append("\nspeed : "); sb.Append(location.Speed);// 单位:公里每小时 sb.Append("\nsatellite : "); sb.Append(location.SatelliteNumber); sb.Append("\nheight : "); sb.Append(location.Altitude);// 单位:米 sb.Append("\ndirection : "); sb.Append(location.Direction);// 单位度 sb.Append("\naddr : "); sb.Append(location.AddrStr); sb.Append("\ndescribe : "); sb.Append("gps定位成功"); } else if (location.LocType == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.Append("\naddr : "); sb.Append(location.AddrStr); //运营商信息 sb.Append("\noperationers : "); sb.Append(location.Operators); sb.Append("\ndescribe : "); sb.Append("网络定位成功"); } else if (location.LocType == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.Append("\ndescribe : "); sb.Append("离线定位成功,离线定位结果也是有效的"); } else if (location.LocType == BDLocation.TypeServerError) { sb.Append("\ndescribe : "); sb.Append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.LocType == BDLocation.TypeNetWorkException) { sb.Append("\ndescribe : "); sb.Append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.LocType == BDLocation.TypeCriteriaException) { sb.Append("\ndescribe : "); sb.Append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.Append("\nlocationdescribe : "); sb.Append(location.LocationDescribe);// 位置语义化信息 System.Collections.Generic.IList<Poi> list = location.PoiList;// POI数据 if (list != null) { sb.Append("\npoilist size = : "); sb.Append(list.Count.ToString()); foreach (Poi p in list) { sb.Append("\npoi= : "); sb.Append(p.Id + " " + p.Name + " " + p.Rank); } } System.Diagnostics.Debug.Write(sb.ToString()); } } } 第六步:查看输出结果 最后附上Demo地址: 链接: https://pan.baidu.com/s/1uHB3whb_aW1uKhJ1v9FLeg 密码: g4xr 记得要换成自己的AK哦~
序言:最近做了一个智能体育项目——跆拳道积分系统,硬件部分会向软件传入振动值等数据,链接方式为串口,所以用到SerialPort类。 值得注意的是: DataReceived 方法,当串口缓冲区有数据时执行该方法。 ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。串口接收的指令可能是错误值,所以这块根据自己需求进行设置。 首先需要引用SerialPort using System.IO.Ports; 创建全局串口对象 SerialPort com; SerialPort配置,并打开端口进行接收数据 private void Form1_Load(object sender, EventArgs e) { com = new SerialPort("COM5"); //实例化SerialPort并设置COM口 com.BaudRate = 115200;//波特率 com.Parity = Parity.None;//无奇偶校验位 com.StopBits = StopBits.Two;//两个停止位 com.Handshake = Handshake.RequestToSend;//控制协议 com.ReceivedBytesThreshold = 13;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数,我这里是13字节为一组 com.Open(); //打开串口 com.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived); //接受数据线程 } /// <summary> /// 监听串口数据线程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { if (com.IsOpen) { byte[] readBuffer = new byte[com.ReadBufferSize + 1]; try { int count = com.Read(readBuffer, 0, com.ReadBufferSize); //读取串口数据(监听) //String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); if (count != 0) { //将返回值byte数组转换为string类型数据 String result = bytesToHexString(readBuffer); //这里强调一下,线程里不可以直接对UI进行赋值 this.BeginInvoke(new System.Threading.ThreadStart(delegate () { textBox1.Text = result; //对控件进行赋值 })); } } catch (TimeoutException) { } } else { TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50); Thread.Sleep(waitTime); } } catch (Exception ex) { } } Byte数组转换成16进制方法 /// <summary> /// Byte数组转换成16进制 /// </summary> /// <param name="bArr"></param> /// <returns></returns> String bytesToHexString(byte[] bArr) { string result = string.Empty; for (int i = 0; i < 13; i++)//逐字节变为16进制字符,以%隔开 { result += Convert.ToString(bArr[i], 16).ToUpper().PadLeft(2, '0') + " "; } return result; } 发送数据 /// <summary> /// 发送数据 /// </summary> void SendData() { Byte[] TxData = { 1, 2, 3, 4, 5, 6, 7, 8 }; com.Write(TxData, 0, 8); } 到这里就结束了,网上也有一些测试串口数据的程序,我这也有一个但是不记得在哪里下载的了,如果有需要跟我吱一声~
目的:使用 SQLiteDatabase 创建本地数据库、表,并对数据进行增删改查操作。 引用命名空间: using Android.App; using Android.Widget; using Android.OS; using Android.Database.Sqlite; using Android.Content; using System.IO; using System.Data; using Mono.Data.Sqlite; using System; using Android.Database; using System.Collections.Generic; Person类 public class Person { public string Id { get; set; } public string Name { get; set; } public string IdCard { get; set; } public string Sex { get; set; } public string Age { get; set; } } 创建局部变量Localhost_DataBase,以及控件,model类 SQLiteDatabase Localhost_DataBase = null; Person person; List<Person> list = new List<Person>(); ListView lv_Person; 创建数据库 /// <summary> /// 创建数据库 /// </summary> void CreateDataBase() { try { //打开或创建数据库 名称为:AssetsManage.db Localhost_DataBase = OpenOrCreateDatabase("AssetsManage.db", FileCreationMode.Private, null); //判断是否存在数据库 if (string.IsNullOrEmpty(GetSharedPreferences("AssetsManage", 0).GetString("AssetsManage", "")))//未创建数据库 { File.Create(Localhost_DataBase.Path); //继续创建数据表 CreateTable(); //存取已创建数据库信息 GetSharedPreferences("AssetsManage", 0).Edit().PutString("AssetsManage", "OK").Commit(); } } catch { //存取创建数据库时的异常 GetSharedPreferences("Exception", 0).Edit().PutString("DataBaseException", "异常").Commit(); } } 创建表 /// <summary> /// 创建表 /// </summary> void CreateTable() { string db = Localhost_DataBase.Path; var conn = new SqliteConnection("Data Source=" + db); //这里可以创建多张表 var commands = new[] { "CREATE TABLE tb_person (Id int,name varchar(20),sex varchar(80),age varchar(20),idcard varchar(18))", "CREATE TABLE tb_grade (uId int,mathgrade varchar(5),Chinese varchar(5),English varchar(5))" }; try { foreach (var cmd in commands) { using (var sqlitecmd = conn.CreateCommand()) { sqlitecmd.CommandText = cmd; sqlitecmd.CommandType = CommandType.Text; conn.Open(); sqlitecmd.ExecuteNonQuery(); conn.Close(); } } InsertData(); } catch (System.Exception e) { //存取创建数据表时的异常 GetSharedPreferences("Exception", 0).Edit().PutString("DataTableException", "异常").Commit(); } } 向表中插入模拟数据 /// <summary> /// 插入数据 /// </summary> void InsertData() { for(int i=1;i<=10;i++) { ContentValues cv = new ContentValues(); cv.Put("Id", i.ToString()); cv.Put("name", "张三" + i.ToString()); cv.Put("sex", new Random().Next(1, 2) == 1 ? "男" : "女"); cv.Put("age", (20 + i).ToString()); cv.Put("idcard", "21072619971111111" + (i - 1).ToString()); Localhost_DataBase.Insert("tb_person", null, cv); ContentValues cv1 = new ContentValues(); cv1.Put("uId", i); cv1.Put("mathgrade", new Random().Next(1, 100)); cv1.Put("Chinese", new Random().Next(1, 100)); cv1.Put("English", new Random().Next(1, 100)); Localhost_DataBase.Insert("tb_grade", null, cv1); } } 查询表中数据 /// <summary> /// 查询数据 /// </summary> void QueryData() { ICursor ic = Localhost_DataBase.Query("tb_person", null, null, null, null, null, null); //全部查询 //ICursor ic = Localhost_DataBase.Query("tb_person", null, " id =? and name =?", new string[] { "1","张三1" }, null, null, null); //条件查询 for (int i = 0; i < ic.Count; i++) { if (i == 0) //确定游标位置 { ic.MoveToFirst(); } else { ic.MoveToNext(); } person = new Person(); person.Id = ic.GetString(ic.GetColumnIndex("Id")); person.Name = ic.GetString(ic.GetColumnIndex("name")); person.Age = ic.GetString(ic.GetColumnIndex("age")); person.Sex= ic.GetString(ic.GetColumnIndex("sex")); person.IdCard = ic.GetString(ic.GetColumnIndex("idcard")); list.Add(person); } lv_Person.Adapter = new ListViewAdapter(this, list); } 根据条件删除表中数据 /// <summary> /// 删除数据 /// </summary> /// <param name="id"></param> void DeleteData(string id) { Localhost_DataBase.Delete("tb_person", " Id=?", new string[] { id }); //Localhost_DataBase.Delete("tb_person", null, null); //删除表中所有数据 } 根据条件修改表中数据 /// <summary> /// 修改数据 /// </summary> /// <param name="name"></param> void UpdateData(string id) { ContentValues cv = new ContentValues(); cv.Put("name", "张三1000"); Localhost_DataBase.Update("tb_person", cv, " Id=? ", new string[] { id }); } ListViewAdapter 类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; namespace LocalhostDataBaseTest { public class ListViewAdapter:BaseAdapter<Person> { Activity context; public List<Person> mings; public ListViewAdapter(Activity context, List<Person> mings) { this.context = context; this.mings = mings; } public override int Count { get { return this.mings.Count; } } public override long GetItemId(int position) { return position; } public override Person this[int position] { get { return this.mings[position]; } } public override View GetView(int position, View convertView, ViewGroup parent) { var itme = this.mings[position]; convertView = LayoutInflater.From(context).Inflate(Resource.Layout.Person_Items, parent, false); TextView item_id = convertView.FindViewById<TextView>(Resource.Id.item_id); TextView item_name = convertView.FindViewById<TextView>(Resource.Id.item_name); TextView item_idcard = convertView.FindViewById<TextView>(Resource.Id.item_idcard); TextView item_sex = convertView.FindViewById<TextView>(Resource.Id.item_sex); TextView item_age = convertView.FindViewById<TextView>(Resource.Id.item_age); item_id.Text = (position + 1).ToString(); item_name.SetText(itme.Name, TextView.BufferType.Normal); item_idcard.SetText(itme.IdCard, TextView.BufferType.Normal); item_sex.SetText(itme.Sex, TextView.BufferType.Normal); item_age.SetText(itme.Age, TextView.BufferType.Normal); return convertView; } } } OnCreate调用 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); lv_Person = FindViewById<ListView>(Resource.Id.listViewPerson); CreateDataBase(); DeleteData("10"); UpdateData("9"); QueryData(); } 到这里就结束了,那里写的不足希望大家补充~ 链接: https://pan.baidu.com/s/1QhDkfSXyVlmWEnIU6VGy-g 密码: isa8
异常:Java.Lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 出现该问题一般分为两种情况: 1.请求的字段不在表中,可能是大小写没写对。(我就是Id写成id出现的错误) 2.字段类型不匹配。
异常: Android.Database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 10 此错误是数据返回到ICursor无法确定获取列的索引,那么需要加上一下代码即可。 if (i == 0) //确定游标位置 { ic.MoveToFirst(); } else { ic.MoveToNext(); } 完整代码Demo: /// <summary> /// 查询数据 /// </summary> void QueryData() { ICursor ic = Localhost_DataBase.Query("tb_person", null, null, null, null, null, null); for (int i = 0; i < ic.Count; i++) { if (i == 0) //确定游标位置 { ic.MoveToFirst(); } else { ic.MoveToNext(); } person = new Person(); person.Id = ic.GetString(ic.GetColumnIndex("Id")); person.Name = ic.GetString(ic.GetColumnIndex("name")); person.Age = ic.GetString(ic.GetColumnIndex("age")); person.Sex= ic.GetString(ic.GetColumnIndex("sex")); person.IdCard = ic.GetString(ic.GetColumnIndex("idcard")); list.Add(person); } lv_Person.Adapter = new ListViewAdapter(this, list); }
有时候使用DataGridView难免会在最后插入一条数据,如果插入的数据超过滚动条显示的行数,那么默认情况下不会显示到最后一行。增加以下代码一直将滚动条拉倒最低。 this.dataGridView1.FirstDisplayedScrollingRowIndex = this.dataGridView1.Rows.Count - 1;
SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。 这里只讲有关SharedPreferences的基本增删改查操作,模拟一个登陆记住账号密码的功能。 新增一个User节点,保存用户名张三、密码666666 GetSharedPreferences("User", 0).Edit().PutString("UserName", "张三").Commit(); //在User节点下编辑UserName的值等于'张三' GetSharedPreferences("User", 0).Edit().PutString("UserPass", "666666").Commit(); //在User节点下编辑UserName的值等于'666666' 查看保存后的数据是否正确 string UserName = GetSharedPreferences("User", 0).GetString("UserName", ""); //获取UserName的值:UserName = '张三' string UserPass = GetSharedPreferences("User", 0).GetString("UserPass", ""); //获取UserPass的值:UserPass='666666' 指定删除UserName和UserPass的数据 GetSharedPreferences("User", 0).Edit().Remove("UserName").Commit(); //删除User节点下名为UserName的节点 GetSharedPreferences("User", 0).Edit().Remove("UserPass").Commit(); //删除User节点下名为UserPass的节点 清空所有数据 GetSharedPreferences("User", 0).Edit().Clear().Commit();
我们在虚拟主机中查看ip地址需要输入ifconfig,但是报以下错误: 系统提示我们安装 net-tools,当我们输入以下命令,即可安装完成。 sudo apt-get install net-tools 然后再输入命令ifconfig即可看到虚拟机的ip地址
解决方法:输入命令 sudo apt-get install lib32stdc++6 提示:ubuntu默认软件包管理器不是yum,而是dpkg,安装软件时用apt-get PS:在ubuntu下最好不要去装yum,不然可能会出现一些奇怪的问题
首先打开终端输入命令 sudo passwd root 然后依次是当前用户密码,将要设置root密码,确认root密码。切换root看一下 备注: #符号 是系统用户 root$符号 是你创建的用户 没指定权限!
VMwareTools作用: 1.增强虚拟显卡和硬盘性能、以及同步虚拟机与主机时钟的驱动程序。 2.可以从物理主机直接往虚拟机里面拖文件。 3.鼠标进入虚拟机后可以直接出来,无需按CTRL+ALT才可以释放鼠标。 4.可以解决Ubuntu主窗口分辨率不适应问题,可自动改成适当的分辨率。安装方法: 选中将要安装的系统,点击虚拟机-->VMware Tools 安装。(我这里已经安装了所以显示重新安装) 然后桌面会出现VMware Tools光盘,单击进去将 VMwareTools-10.1.6-5214329.tar.gz 拷贝到主目录下 打开终端数据命令: ls 可以查看到压缩文件 VMwareTools-10.1.6-5214329.tar.gz 输入解压命令 tar -zxvf VMwareTools-10.1.6-5214329.tar.gz 解压后再输入命令 ls 可以查看到文件夹 vmware-tools-distrib ls 然后进入该文件夹 cd vmware-tools-distrib 输入命令 ls 可以查看到可执行文件 vmware-install.pl ls 然后执行安装文件,输入密码即可安装 sudo ./vmware-install.pl 见到默认yes就输yes,默认No或其他按回车(enter)。失败可按快捷键 ctrl+z 退出,重新执行安装文件即可。 安装完成以后,路径会停留在 vmware-tools-distrib 文件夹下,直接输入 reboot 重启即可。 reboot 到这里 VMware Tools 就安装完毕了,大家可以试试主机向宿机进行拖拽文件了~
安装Ubuntu18.04虚拟机 Ubuntu获取地址: 官网:https://www.ubuntu.com/download/server 清华镜像站:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/18.04/ VMware获取地址: 链接: https://pan.baidu.com/s/1vNBBmWV6VCe31J7SZ_uVQA 密码: 46qf 安装过程 1.新建虚拟机 2.选择稍后安装操作系统 3.客户机操作系统选择Linux,版本选择Ubuntu 64位 4.位置,名称都可以根据自己的需求进行更改 5.默认选择,后期更改 6.没有打印机需求时可以移除掉 7.根据自己的需求提升内存,我这里提升到2G内存 8.根据自己的需求提升处理器数量 9.根据自己的需求提升磁盘大小,我这里为60GB 10.选择自己下载好的映像文件 11.开启此虚拟机进行安装 12.默认选择汉语 13.默认选项,继续安装 14.选择清除整个磁盘并安装 Ubuntu 15.地区选择上海 16.自定义姓名,用户名 17.安装大约5~10分钟,静心等待即可 18.安装完毕提示重启 19.重启后看到的界面,默认像素为800*600,可根据自己需求进行更改 20.右键选择更换背景-->设备-->分辨率进行更改,保存后即可显示设置后的分辨率大小 21.更改分辨率后现实的效果 到这里就结束了,最近是工作需求才接触linux,如果哪里写的不对希望大佬指出,以便我修改不误导他人~
一、引入命名空间 using Android.Media; 二、声明变量 SoundPool soundPool; int soundPoolId; 三、实例化对象 soundPool = new SoundPool(10, Stream.Music, 0); soundPoolId = soundPool.Load(this, Resource.Drawable.beep, 1); 四、读取mp3音频 private void Sound() { //第一个参数为id //第二个和第三个参数为左右声道的音量控制 //第四个参数为优先级,由于只有这一个声音,因此优先级在这里并不重要 //第五个参数为是否循环播放,0为不循环,-1为循环 // //最后一个参数为播放比率,从0.5到2,一般为1,表示正常播放。 soundPool.Play(soundPoolId, 1, 1, 0, 0, 1); } 五、调用Sound()方法即可
使用ListView进行数据绑定 第一步:新建一个类,用于存储显示字段。 namespace ListViewDataBIndDemo { public class Person { public int Id { get; set; } public string Name { get; set; } public string IdCard { get; set; } public string Sex { get; set; } public string Age { get; set; } } } 第二步:在Mian.axml 中绘制界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:layout_marginTop="10dp"> <TextView android:text="姓名" android:textSize="23sp" android:layout_width="150dp" android:layout_height="match_parent" /> <EditText android:id="@+id/personName" android:layout_width="280dp" android:layout_height="wrap_content" android:singleLine="true" /> </LinearLayout> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp"> <LinearLayout android:id="@+id/LinearLayoutdasb2" android:layout_width="wrap_content" android:orientation="vertical" android:layout_height="match_parent"> <LinearLayout android:id="@+id/LinearLayoutdasb3" android:layout_width="wrap_content" android:orientation="horizontal" android:layout_height="27dp" android:background="#C0C0C0"> <TextView android:text="序号" android:layout_width="50dp" android:gravity="center" android:textColor="#000000" android:textSize="20sp" android:layout_height="wrap_content" /> <TextView android:text="姓名" android:layout_width="100dp" android:gravity="center" android:textSize="20sp" android:textColor="#000000" android:layout_height="wrap_content" /> <TextView android:text="身份证号" android:layout_width="250dp" android:gravity="center" android:textSize="20sp" android:textColor="#000000" android:layout_height="wrap_content" /> <TextView android:text="性别" android:layout_height="wrap_content" android:gravity="center" android:textSize="20sp" android:textColor="#000000" android:layout_width="80dp" /> <TextView android:text="年龄" android:layout_width="80dp" android:gravity="center" android:textColor="#000000" android:textSize="20sp" android:layout_height="wrap_content" /> </LinearLayout> <LinearLayout android:id="@+id/LinearLayout54" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFAF0"> <ListView android:id="@+id/listViewPerson" android:minWidth="30dp" android:minHeight="30dp" android:layout_width="550dp" android:layout_height="match_parent" android:divider="#000000" android:dividerHeight="1dp" /> </LinearLayout> </LinearLayout> </HorizontalScrollView> </LinearLayout> 第三步:创建一个 Person_Items.axml 用于存放数据 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dip"> <TextView android:id="@+id/item_id" android:layout_width="40dp" android:layout_height="wrap_content" android:textColor="#000000" android:layout_marginLeft="20dp" android:gravity="left" android:textSize="20sp" /> <TextView android:id="@+id/item_name" android:layout_width="90dp" android:layout_height="wrap_content" android:textColor="#000000" android:layout_marginLeft="20dp" android:gravity="left" android:textSize="20sp" /> <TextView android:id="@+id/item_idcard" android:layout_width="240dp" android:layout_height="wrap_content" android:textColor="#000000" android:gravity="left" android:layout_marginLeft="10dp" android:textSize="20sp" /> <TextView android:id="@+id/item_sex" android:layout_width="70dp" android:layout_height="wrap_content" android:textColor="#000000" android:gravity="left" android:layout_marginLeft="10dp" android:textSize="20sp" /> <TextView android:id="@+id/item_age" android:layout_width="70dp" android:layout_height="wrap_content" android:textColor="#000000" android:gravity="left" android:layout_marginLeft="10dp" android:textSize="20sp" /> </LinearLayout> 第四步:创建一个继承于BaseAdapter的类名为ListViewAdapter using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; namespace ListViewDataBIndDemo { public class ListViewAdapter:BaseAdapter<Person> { Activity context; public List<Person> mings; public ListViewAdapter(Activity context, List<Person> mings) { this.context = context; this.mings = mings; } public override int Count { get { return this.mings.Count; } } public override long GetItemId(int position) { return position; } public override Person this[int position] { get { return this.mings[position]; } } public override View GetView(int position, View convertView, ViewGroup parent) { var itme = this.mings[position]; convertView = LayoutInflater.From(context).Inflate(Resource.Layout.Person_Items, parent, false); TextView item_id = convertView.FindViewById<TextView>(Resource.Id.item_id); TextView item_name = convertView.FindViewById<TextView>(Resource.Id.item_name); TextView item_idcard = convertView.FindViewById<TextView>(Resource.Id.item_idcard); TextView item_sex = convertView.FindViewById<TextView>(Resource.Id.item_sex); TextView item_age = convertView.FindViewById<TextView>(Resource.Id.item_age); item_id.Text = (position + 1).ToString(); item_name.SetText(itme.Name, TextView.BufferType.Normal); item_idcard.SetText(itme.IdCard, TextView.BufferType.Normal); item_sex.SetText(itme.Sex, TextView.BufferType.Normal); item_age.SetText(itme.Age, TextView.BufferType.Normal); return convertView; } } } 第五步:在MainActivity进行对数据绑定 using Android.App; using Android.Widget; using Android.OS; using System.Collections.Generic; using System; namespace ListViewDataBIndDemo { [Activity(Label = "ListViewDataBIndDemo", MainLauncher = true, Theme = "@android:style/Theme.Holo.Light")] public class MainActivity : Activity { private List<Person> main_data = new List<Person>(); private Person person; ListView lv_Person; EditText personName; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); lv_Person = FindViewById<ListView>(Resource.Id.listViewPerson); personName = FindViewById<EditText>(Resource.Id.personName); for (int i = 1; i <= 20; i++) { person = new Person(); person.Id = i; person.Name = "张三" + i.ToString(); person.IdCard = "20172619979999" + new Random().Next(1000, 10000).ToString(); person.Sex = new Random().Next(1, 3).ToString() == "1" ? "男" : "女"; person.Age = new Random().Next(15, 30).ToString(); main_data.Add(person); } lv_Person.Adapter = new ListViewAdapter(this, main_data); lv_Person.ItemClick += (s, e) => { Toast.MakeText(this, "姓名:"+main_data[e.Position].Name +"\n身份证号:"+main_data[e.Position].IdCard, ToastLength.Long).Show(); }; //搜索姓名 personName.TextChanged += (s, e) => { List<Person> per = selectList(main_data, personName.Text); lv_Person.Adapter = new ListViewAdapter(this, per); }; } private List<Person> selectList(List<Person> list, string value) { return list.FindAll(delegate (Person info) { if ((!string.IsNullOrEmpty(info.Name) && info.Name.Contains( value))) { return true; } else { return false; } }); } } } 效果图: 链接: https://pan.baidu.com/s/1MRQjgvAuY5M96cbBi895-g 密码: i4fh
1.查看python版本 python -V 以上命令执行结果如下: 2.标识符 第一个字符必须是字母表中字母或下划线 _ 。 标识符的其他的部分由字母、数字和下划线组成。 标识符对大小写敏感。 3.python保留字 保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字: >>> import keyword >>> keyword.kwlist['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] 4.注释 Python中单行注释以 # 开头,实例如下: # 第一个注释 print ("Hello, Python!") 多行注释可以用多个 # 号,还有 ''' 和 """: # 第一个注释 # 第二个注释 ''' 第三注释 第四注释 ''' """ 第五注释 第六注释 """ print ("Hello, Python!") 5.行与缩进 python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。 缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。 if True: print('True') else: print('False') 以下代码最后一行语句缩进数的空格数不一致,会导致运行错误: if True: print('C') print('C#') else: print('python') print('java') # 缩进不一致,会导致运行错误错误:IndentationError: unindent does not match any outer indentation level 补充:if else 后的参数可不写"()",单必须写":" 6.多行语句 Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句 total = "item_one \ item_two \ item_three" 在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\) total = ['one', 'two', 'three'] 7.等待用户输入 temp = input('\n请输入内容:') print(temp) \n在结果输出前会输出个新的空行 8.同一行显示多条语句 Python可以在同一行中使用多条语句,语句之间使用分号(;)分割 import sys; x = 'runoob'; sys.stdout.write(x + '\n') # 输出结果:runoob 9.Print 输出 print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end="": string1 = "one" string2 = "two" # 换行输出 print(string1) print(string2) # 不换行输出 print(string1,end=" ") print(string2) 10.import 与 from...import 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(turtle)导入,格式为: import turtle 从某个模块中导入某个函数,格式为: from turtle import done 从某个模块中导入多个函数,格式为:from turtle import done,deepcopy 将某个模块中的全部函数导入,格式为: from turtle import * import turtle from turtle import done from turtle import done,deepcopy from turtle import * 11.命令行参数 很多程序可以执行一些操作来查看一些基本信息,Python可以使用-h参数查看各参数帮助信息
PyInstaller可以用来打包python应用程序,打包完的程序就可以在没有安装Python解释器的机器上运行了。类似于C#窗体程序使用Setup Factory 9 Trial进行打包。 安装:PyInstaller,打开cmd命令行执行 pip install pyinstaller pip install pyinstaller 当出现Successfully表示安装成功 打包:接下来找到将要打包的程序,例如我的放在 F:\Python\Python36-32\Project,然后执行 pyinstaller -F +文件名即可,这里我的文件名为SevenDigitsDrawV2.py pyinstaller -F SevenDigitsDrawV2.py 然后可以在目录下看到多出来三个文件夹,即:__pycache__,build,dist,其中__pycache__,build无用可删除,生成好的exe文件在dist下。 打开便可执行应用程序。 PyInstaller 库常用参数: 参数 描述 -h 查看帮助 --clean 清理打包过程中的临时文件 -D,--onedir 默认值。生成dist文件夹 -F,--onefile 在dist文件夹中只生成独立的打包文件 -i <图标文件名.ico> 指定打包程序使用的图标(icon)文件
一、python下的numpy安装方法 第一步:安装python,这里不做介绍。 第二步:打开cmd看python是否安装成功。 第三步:输入 python -m pip install -U pip 安装pip文件,pip文件一般在python安装包的script目录下。 第四步:将pip所在的文件目录添加到环境变量中,我这里是放在F:\Python\Python36-32\Scripts;下。 第五步:下载相应版本的numpy安装包,whl文件。记者不要下载错,否则会安装不上的。 numpy whl 地址:https://pypi.org/project/numpy/#files。 由于我的python版本是3.6.5所以选择这个: 第六步:安装numpy,找到下载的whl,我的放在F盘根目录下,然后输入 pip install numpy-1.14.3-cp36-none-win32.whl ,当然这里要替换成自己下的版本。 如果出现这种情况就证明,下载的whl和python版本不符,从新找到正确的whl安装即可。 第七步:测试numpy是否安装成功。 二、pycharm环境安装numpy方法 第一步:打开环境找到 File-->Setting-->Project Interpreter,如图所示。 我这里已经安装好numpy,如果没安装好点击绿色加号。 第二步:搜索numpy,选择版本号,安装即可,大约1~2分钟。 第三步:测试是否安装成功。 好了,本篇到这里就结束了,希望能对大家有所帮助~
效果: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace DataGridViewDownComboBoxDemo { public partial class Form1 : Form { //级联的列 DataGridViewComboBoxColumn columns3 = null; public Form1() { InitializeComponent(); this.dataGridView1.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; } /// <summary> /// 绑定GRIDVIEW /// </summary> public void GetData() { //第二列 DataGridViewComboBoxColumn columns2 = new DataGridViewComboBoxColumn(); columns2.Name = "col2"; columns2.DataPropertyName = "Type"; //从数据源绑定列,这一列就是那个值 columns2.HeaderText = "货区"; string[] strTmp = new string[] { "货区A", "货区B", "货区C" , "货区D", "货区E", "货区F" }; DgvCombobox(ref columns2, strTmp);//此方法是定义的关键 //第三列 columns3 = new DataGridViewComboBoxColumn(); columns3.Name = "col3"; columns3.HeaderText = "货架"; //生成gridview数据源 DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("序号")); dt.Columns.Add(new DataColumn("物资名称")); dt.Columns.Add(new DataColumn("物资编号")); for (int i = 0; i < 20; i++) { DataRow dr = dt.NewRow(); dr[0] = i+1; dr[1] = "戴尔笔记本"; dr[2] = "00000"+(i+1).ToString(); dt.Rows.Add(dr); } this.dataGridView1.DataSource = dt; //gridview添加列 dataGridView1.Columns.AddRange(new DataGridViewColumn[] { columns2, columns3 }); } /// <summary> /// 绑定第二列 /// </summary> /// <param name="column"></param> /// <param name="strTmp"></param> public void DgvCombobox(ref DataGridViewComboBoxColumn column, string[] strTmp) { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("tmp", typeof(string)); dt.Columns.Add(dc); dt.Columns.Add(new DataColumn("ID", typeof(string))); DataRow dr; for (int i = 0; i < strTmp.Length; i++) { dr = dt.NewRow(); dr["tmp"] = strTmp[i]; dr["id"] = i; dt.Rows.Add(dr); } //为combobox绑定生成的表 column.DataSource = dt; //combobox列的数据源,绑定为生成的表 column.DisplayMember = "tmp";//要显示的名称,表的文字例 column.ValueMember = dt.Columns[1].ToString();//文字对应的值,此列将和columns2.DataPropertyName 属性的值对应来显示选中的值 } private void Form1_Load(object sender, EventArgs e) { this.GetData(); } //添加委托事件 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (this.dataGridView1.CurrentCell.OwningColumn.Name == "col2") { ((ComboBox)e.Control).SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged); } } private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (this.dataGridView1.CurrentCell.OwningColumn.Name == "col2") { string str = ((ComboBox)sender).Text.ToString(); //绑定第二个COMBOX DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("id")); dt.Columns.Add(new DataColumn("text")); for (int i = 0; i < 20; i++) { DataRow dr = dt.NewRow(); dr[0] = str + i; dr[1] = str + i; dt.Rows.Add(dr); } ((DataGridViewComboBoxCell)this.dataGridView1.CurrentRow.Cells[4]).DataSource = dt; ((DataGridViewComboBoxCell)this.dataGridView1.CurrentRow.Cells[4]).DisplayMember = "text"; ((DataGridViewComboBoxCell)this.dataGridView1.CurrentRow.Cells[4]).ValueMember = "id"; ((ComboBox)sender).SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged); } } } } 提示:此demo不需要链接数据库,只要在自己的窗体上创建一个datagridview命名为datagridview1即可。 datagridview1的EditMode设为EditOnEnter可实现点击一次就出下拉列表。
目的:制作第一个项目,输出“Hello, world” 首先查看自己电脑上的python版本号,方法打开cmd输入python 如果提示:不是内部或外部命令,也不是可运行的程序或批处理文件。那么需要设置环境变量。 我的电脑-->属性-->高级系统设置-->高级-->环境变量-->找到Path把自己安装好的python加到这里,别忘记需要分号隔开。 接下来在cmd中再次输入python,然后输入print('hello,world') 但是这样的程序无法保存,我们可以使用.py文件在这里打开,不建议使用windows自带的word和txt,他俩会在头文件产生多余代码,我这里用PyCharm 新建一个项目名为PythonProjectTest 然后再PythonProjectTest项目右键-->New-->Python File 新建一个名为test的python文件 然后在新建页面输入 print('hello,world') 点击运行按钮或者按 Shift+Ctrl+F10 运行程序 保存该项目后,在cmd中运行 打开本项目保存的地址,然后输入 python test.py 即可 到这里本篇文章结束,本人也是刚自学python,那里说的不对望指教~
代码: private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { DataGridView dgv = sender as DataGridView; Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height); TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rectangle, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right); } 效果:
调用本地相册选中照片在ImageView上显示 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Android.Provider; using Android.Database; using System.Threading; using Java.IO; namespace CallLocalPhoto { [Activity(Label = "CallLocalPhoto", MainLauncher = true)] public class MainActivity : Activity { Button btn; ImageView iv; private Java.IO.File originalFile; private const int PhotoGallery_RequestCode = 1; //设置返回代码Code,可自行定义 protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); originalFile = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory( Android.OS.Environment.DirectoryPictures ), "zcb_pic_" + SystemClock.CurrentThreadTimeMillis() + ".png"); btn = FindViewById<Button>(Resource.Id.button1); iv = FindViewById<ImageView>(Resource.Id.imageView1); btn.Click += Btn_Click; } private void Btn_Click(object sender, EventArgs e) { CutImageByImgStore(); } /// <summary> /// 调用相册选择 /// </summary> private void CutImageByImgStore() { Intent _intentCut = new Intent(Intent.ActionGetContent, null); _intentCut.SetType("image/*");// 设置文件类型 _intentCut.PutExtra(MediaStore.ExtraOutput, Android.Net.Uri.FromFile(originalFile)); _intentCut.PutExtra(MediaStore.ExtraVideoQuality, 1); StartActivityForResult(_intentCut, PhotoGallery_RequestCode); } /// <summary> /// 选择图片后返回 /// </summary> /// <param name="requestCode"></param> /// <param name="ResultStatus"></param> /// <param name="data"></param> protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result ResultStatus, Intent data) { if (ResultStatus == Result.Ok) { /* * 若系统版本低于4.4,返回原uri * 若高于4.4,解析uri后返回 * */ if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat) { var url = Android.Net.Uri.Parse("file://" + GetPath(BaseContext, data.Data)); data.SetData(url); //将本地相册照片显示在控件上 iv.SetImageURI(Android.Net.Uri.FromFile(new File(GetPath(BaseContext, data.Data)))); } } } #region 高于 v4.4 版本 解析真实路径 public static String GetPath(Context context, Android.Net.Uri uri) { bool isKitKat = Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat; // DocumentProvider if (isKitKat && DocumentsContract.IsDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { String docId = DocumentsContract.GetDocumentId(uri); String[] split = docId.Split(':'); String type = split[0]; if ("primary".Equals(type.ToLower())) { return Android.OS.Environment.ExternalStorageDirectory + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { String id = DocumentsContract.GetDocumentId(uri); Android.Net.Uri contentUri = ContentUris.WithAppendedId( Android.Net.Uri.Parse("content://downloads/public_downloads"), long.Parse(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { String docId = DocumentsContract.GetDocumentId(uri); String[] split = docId.Split(':'); String type = split[0]; Android.Net.Uri contentUri = null; if ("image".Equals(type)) { contentUri = MediaStore.Images.Media.ExternalContentUri; } else if ("video".Equals(type)) { contentUri = MediaStore.Video.Media.ExternalContentUri; } else if ("audio".Equals(type)) { contentUri = MediaStore.Audio.Media.ExternalContentUri; } String selection = "_id=?"; String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".Equals(uri.Scheme.ToLower())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.LastPathSegment; return getDataColumn(context, uri, null, null); } // File else if ("file".Equals(uri.Scheme.ToLower())) { return uri.Path; } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Android.Net.Uri uri, String selection, String[] selectionArgs) { ICursor cursor = null; String column = "_data"; String[] projection = { column }; try { cursor = context.ContentResolver.Query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.MoveToFirst()) { int index = cursor.GetColumnIndexOrThrow(column); return cursor.GetString(index); } } finally { if (cursor != null) cursor.Close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static bool isExternalStorageDocument(Android.Net.Uri uri) { return "com.android.externalstorage.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static bool isDownloadsDocument(Android.Net.Uri uri) { return "com.android.providers.downloads.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static bool isMediaDocument(Android.Net.Uri uri) { return "com.android.providers.media.documents".Equals(uri.Authority); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static bool isGooglePhotosUri(Android.Net.Uri uri) { return "com.google.android.apps.photos.content".Equals(uri.Authority); } #endregion } } 下载地址: 链接: https://pan.baidu.com/s/1Yhlv2oHsAH-9Hs8WolX7Lw 密码: h6g7
我们有时候会通过WebServices上传数据,如果信息量过大并没有提示,用户会觉得是死机,或是系统崩溃,这时候我们可以用到AsyncTask(异步任务)来提示上传信息,例如:正在上传数据... 这里是官方对AsyncTask的详细文档:https://developer.xamarin.com/api/type/Android.OS.AsyncTask/ 下面是我对AsyncTask的了解:首先实例化继承AsyncTask的类InitTask(当然这里可以随便命名) --> 接着开始执行任务 OnPreExecute 方法 --> 后台执行任务 DoInBackground 方法 --> 执行后返回 OnPostExecute ,简单使用调用这几个方法就足够了,哪里不足希望大佬补充。 using Android.App; using Android.Widget; using Android.OS; using System.Threading; namespace AsyncTaskDemo { [Activity(Label = "AsyncTaskDemo", MainLauncher = true)] public class MainActivity : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); Button btn = FindViewById<Button>(Resource.Id.button1); btn.Click += (s, e) => { new InitTask(this).Execute(); //调用异步任务 }; } //开启一个线程,沉睡10秒,模拟上传数据 void TestThead() { Thread.Sleep(10000); } private class InitTask : AsyncTask<Java.Lang.Void, Java.Lang.Void, string[]> { MainActivity main; ProgressDialog proDialg = null; public InitTask(MainActivity _main) { main = _main; } protected override string[] RunInBackground(params Java.Lang.Void[] @params) { //throw new NotImplementedException (); return null; } //后台要执行的任务 protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params) { main.TestThead(); return "OK"; } //执行后返回 protected override void OnPostExecute(Java.Lang.Object result) { proDialg.Cancel(); if (result.ToString() != "OK") Toast.MakeText(main, "获取数据失败!", ToastLength.Short); } //开始执行任务 protected override void OnPreExecute() { proDialg = new ProgressDialog(main); proDialg.SetProgressStyle(ProgressDialogStyle.Spinner); //设置界面不可操作 返回键有效 //proDialg.SetCanceledOnTouchOutside(false); proDialg.SetMessage("正在上传数据..."); //设置界面不可操作 返回键无效 proDialg.SetCancelable(false); proDialg.Show(); } } } } 最后附上下载地址: 链接: https://pan.baidu.com/s/1u5TNukLQH5ycjBMWs4ZzLg 密码: w7q6
最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-->判断是否具备拍照功能-->创建图片目录(文件夹)-->点击拍照事件-->返回图片并绑定在控件上显示。 引用命名空间: using System; using System.Collections.Generic; using Android.App; using Android.Content; using Android.Content.PM; using Android.Graphics; using Android.OS; using Android.Provider; using Android.Widget; using Java.IO; using Environment = Android.OS.Environment; using Uri = Android.Net.Uri; 加载: protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); if (IsThereAnAppToTakePictures()) //判断本设备是否存在拍照功能 { CreateDirectoryForPictures(); Button button = FindViewById<Button>(Resource.Id.myButton); _imageView = FindViewById<ImageView>(Resource.Id.imageView1); button.Click += TakeAPicture; } } 判断是否具备拍照功能: /// <summary> /// 判断是否具备拍照功能 /// </summary> /// <returns></returns> private bool IsThereAnAppToTakePictures() { Intent intent = new Intent(MediaStore.ActionImageCapture); IList<ResolveInfo> availableActivities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly); return availableActivities != null && availableActivities.Count > 0; } 创建图片目录(文件夹): /// <summary> /// 创建目录图片 /// </summary> private void CreateDirectoryForPictures() { App._dir = new File( Environment.GetExternalStoragePublicDirectory( Environment.DirectoryPictures), "CameraAppDemo"); //CameraAppDemo if (!App._dir.Exists()) { App._dir.Mkdirs(); } } 点击拍照事件: /// <summary> /// 拍照 /// </summary> /// <param name="sender"></param> /// <param name="eventArgs"></param> private void TakeAPicture(object sender, EventArgs eventArgs) { Intent intent = new Intent(MediaStore.ActionImageCapture); App._file = new File(App._dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid())); //保存路径 intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(App._file)); StartActivityForResult(intent, 0); } 返回图片并绑定在控件上显示: /// <summary> /// 拍照结束执行 /// </summary> /// <param name="requestCode"></param> /// <param name="resultCode"></param> /// <param name="data"></param> protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile); Uri contentUri = Uri.FromFile(App._file); mediaScanIntent.SetData(contentUri); SendBroadcast(mediaScanIntent); // Display in ImageView. We will resize the bitmap to fit the display // Loading the full sized image will consume to much memory // and cause the application to crash. int height = Resources.DisplayMetrics.HeightPixels; int width = _imageView.Height; //获取拍照的位图 App.bitmap = App._file.Path.LoadAndResizeBitmap(width, height); if (App.bitmap != null) { //将图片绑定到控件上 _imageView.SetImageBitmap(App.bitmap); //清空bitmap 否则会出现oom问题 App.bitmap = null; } // Dispose of the Java side bitmap. GC.Collect(); } LoadAndResizeBitmap方法: public static Bitmap LoadAndResizeBitmap(this string fileName, int width, int height) { // First we get the the dimensions of the file on disk BitmapFactory.Options options = new BitmapFactory.Options { InJustDecodeBounds = true }; BitmapFactory.DecodeFile(fileName, options); // Next we calculate the ratio that we need to resize the image by // in order to fit the requested dimensions. int outHeight = options.OutHeight; int outWidth = options.OutWidth; int inSampleSize = 1; if (outHeight > height || outWidth > width) { inSampleSize = outWidth > outHeight ? outHeight / height : outWidth / width; } // Now we will load the image and have BitmapFactory resize it for us. options.InSampleSize = inSampleSize; options.InJustDecodeBounds = false; Bitmap resizedBitmap = BitmapFactory.DecodeFile(fileName, options); return resizedBitmap; } App类: public static class App { public static File _file; public static File _dir; public static Bitmap bitmap; } 最后再附上下载地址: 链接: https://pan.baidu.com/s/1h0Zg1jkCyKrZKN6N5eIB8Q 密码: wgdm
我们有时候会从Android原生开发(Java)转移到Xamarin.Android开发时,需要将过去写好的Android Class Library直接嵌入到Xamarin.Android底下使用,这样就不再从新写一遍代码了。 提示:滚动条看着短,实际截图多,看之前不要慌~ 在Eclipse中制作Android Class Library的jar文件 项目建立完会有一个 New Android Application填写框 接着在项目的src文件夹下点选右键,选单当中New->Package,来建立该ClassLibrary的程序所在的Package。 新增完成后在此项目当中呈现的效果: 接着在这个Package底下继续增加类别程序代码档。在Package上右键选单中,点选New->Class。 接着将这个类别命名为MyMathClass,点选Finish。 完成后继续增加点程序代码,在这个类别当中,增加了两个静态方法,供之后引用的项目可以直接使用。 接着直接在项目上右键选单,点选Build Project(使用截图老是把右键出来的子菜单给屏蔽掉,所里这里没有做截图)。 然后展开项目当中的bin文件夹,应该就可以看到我们终于制作出androidclasslibraryprojecttest.jar可以让应用项目使用。 接着开始弄C#环境: 在新增C#项目的模板当中,选到Xamarin.Android的项目模板,这边采用默认名称App1,接着点选确定。 接着在解决方案中添加一个新建项目 在项目模板当中,选到BindingsLibrary(Android)的模板后,将此项目取名为MyBindingsClassLibrary后,点选确定。 现在解决方案中呈现的效果 在新增好的BindingsLibrary项目当中,找到jar文件夹在上面右键选单,添加-->现有项 调整该Jar文件属性当中的生成操作为EmbeddedJar。 在MyBindingsClassLibrary的专案档上右键选单,点击生成。 回到App1项目中的右键引用,将MyBindingsClassLibrary添加到引用项。 加入引用完成后,在解决方案呈现的效果。 接着我们打开App1项目当中的MainActivity.cs档,来添加一些测试的程序代码。 最后的测试结果:
随着手机的拍照像素越来越高,导致图片赞的容量越来越大,如果上传多张图片不进行压缩、质量处理很容易出现OOM内存泄漏问题。 最近做了一个项目,向webservices上传多张照片,但是项目部署出来就会出现闪退现象,后来经行调试发现图片没有进行压缩,一张图片大小为2M,然而webservices没法接搜多个大图片,所以需要改下配置文件,我这里改为40M。 <system.web> <httpRuntime maxRequestLength = "40960" useFullyQualifiedRedirectUrl="true"/> </system.web> 这里改好后发现上传图片还是有问题,后来经过一步步调试发现将本地图片转换成Bitmap后没有清空,然后一直存放在内存中,导致内存泄漏。只要把转换完的Bitmap清空一下就好了。 /// <summary> /// 图片转换成String流 /// </summary> /// <param name="file_path">文件名(不带file://)</param> /// <returns></returns> public static string ImageToString(string file_path) { //待上传图片路径 //string uploadFile = file_path; //转化成文件 //System.IO.FileInfo imgFile = new System.IO.FileInfo(uploadFile); ////文件转化成字节 //byte[] imgByte = new byte[imgFile.Length]; //////读文件 //System.IO.FileStream imgStream = imgFile.OpenRead(); //////文件写入到字节数组 //imgStream.Read(imgByte, 0, Convert.ToInt32(imgFile.Length)); //////字节数组转换成String类型 //string by = Convert.ToBase64String(imgByte); ////上传到服务器 后面是文件名 ////fileUp.UpdateFile(imgByte, Guid.NewGuid() + ".png"); //return imgByte; Bitmap bitmap = BitmapFactory.DecodeFile(file_path); //将图片文件转换成bitmap 格式:/storage/emulated/0/DCIM/Camera/IMG_20180425_105725.jpg string bitstring = BitmapToString(bitmap); bitmap = null; //一定要清空,否则会导致OOM问题 GC.Collect(); return bitstring; } /// <summary> /// 图片缩放处理 /// </summary> /// <param name="bgimage">Bitmap文件</param> /// <param name="newWidth">新图片宽度</param> /// <param name="newHeight">新图片高度</param> /// <returns></returns> public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) { // 获取这个图片的宽和高 float width = bgimage.Width; float height = bgimage.Height; // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算宽高缩放率 float scaleWidth = ((float)newWidth) / width; float scaleHeight = ((float)newHeight) / height; // 缩放图片动作 matrix.PostScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.CreateBitmap(bgimage, 0, 0, (int)width, (int)height, matrix, true); return bitmap; } static string BitmapToString(Bitmap bitmap) { Bitmap bit = zoomImage(bitmap, 750, 1000);//小图 //质量压缩 //MemoryStream stream = new MemoryStream(); //bit.Compress(Bitmap.CompressFormat.Jpeg, 50, stream); //byte[] bitmapData = stream.ToArray(); //Bitmap map = BitmapFactory.DecodeByteArray(bitmapData, 0, bitmapData.Length); //btn_imagetwo.SetImageBitmap(map); //Bitmap im = zoomImage(bitmap, 800, 900);//大图 MemoryStream big_stream = new MemoryStream(); bit.Compress(Bitmap.CompressFormat.Jpeg, 80, big_stream); byte[] big_bitmapData = big_stream.ToArray(); return Convert.ToBase64String(big_bitmapData); } webservices接受进行保存图片: private String ImagePath = "/HandlerImages/"; /// <summary> /// 上传图片 /// </summary> /// <param name="content">图片字符流</param> /// <param name="pathandname">图片名称</param> /// <returns></returns> [WebMethod] public bool UpdateFile(string content, string pathandname) { //保存图片路径 string FilePath = Server.MapPath(ImagePath); //判断路径是否存在 if (!Directory.Exists(FilePath)) { //创建路径 Directory.CreateDirectory(FilePath); } string SaveFilePath = Path.Combine(FilePath, pathandname); byte[] fileBytes; try { fileBytes = Convert.FromBase64String(content); MemoryStream memoryStream = new MemoryStream(fileBytes); //1.定义并实例化一个内存流,以存放提交上来的字节数组。 FileStream fileUpload = new FileStream(SaveFilePath, FileMode.Create); ///2.定义实际文件对象,保存上载的文件。 memoryStream.WriteTo(fileUpload); ///3.把内存流里的数据写入物理文件 memoryStream.Close(); fileUpload.Close(); fileUpload = null; memoryStream = null; return true; } catch { return false; } } 调用webservices上传图片: MyWebService service = new MyWebService(); service.UpdateFile(ImageToByte("/storage/emulated/0/DCIM/Camera/IMG_20180425_105725.jpg"),Guid.NewGuid().ToString() + ".jpg");
1.存储登陆信息 if(login_cb_user.Checked) { ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); ISharedPreferencesEditor editor = prefs.Edit(); editor.PutBoolean("Ck_Status", true); editor.PutString("UserName", UserName); editor.Commit(); editor.Apply(); } else { ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); ISharedPreferencesEditor editor = prefs.Edit(); editor.PutBoolean("Ck_Status", false); editor.PutString("UserName", null); editor.Commit(); editor.Apply(); } 2.读取登录信息 ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(this); login_cb_user.Checked = prefs.GetBoolean("Ck_Status", false); login_et_user.Text = prefs.GetString("UserName", null);
问题描述:使用so包时报错。 解决方法: 1.保证 libs > armeabi 和 armeabi-v7a 中的so包一致。 2.去掉 x86,x86_64,arm64-v8a。 3. so的生成操作修改成 AndroidNativeLibrary。 然后进行调试,就不会出现问题了。 如果程序无法调试,输出中提示:(无法连接到logcat,GetProcessId 返回了:0) 那么取消掉 使用共享运行时,低版本的Xamarin取消掉 Use Shared Runtime
前言: 刚接触Xamarin.Android不到一个月时间,却被他折磨的不要不要的,随着开发会出现莫名其妙的问题,网上类似Xamarin.Android的文档也不多,于是本片文章是按照Java开发Android的思路写过来的,于是记录下来,希望大家碰到这个问题少走些弯路。 问题描述: 在执行线程内想给TextView赋值发生错误。 错误提示: Android.Util.AndroidRuntimeException: Only the original thread that created a view hierarchy can touch its views. 问题原因: 原来Android中相关的view和控件不是线程安全的,我们必须单独做处理。这里借此引出Handler的使用。 Handler的机制: handler机制,在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长时间的任务后做出相应的通知。 Handler的作用: 当我们需要在子线程处理耗时的操作(例如访问网络,数据库的操作),而当耗时的操作完成后,需要更新UI,这就需要使用Handler来处理,因为子线程不能做更新UI的操作。Handler能帮我们很容易的把任务(在子线程处理)切换回它所在的线程。简单理解,Handler就是解决线程和线程之间的通信的。 原有错误代码: using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using System.Threading; namespace App1 { [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { TextView tv1; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += delegate { TestThread(); }; tv1 = FindViewById<TextView>(Resource.Id.textView1); } private void TestThread() { Boolean loopFlag = true; Thread th = new Thread(new ThreadStart(delegate { int i = 0; while (loopFlag && i < 5) { if (i == 3) { tv1.Text = "测试赋值"; loopFlag = false; } i++; } })); th.Start(); } } } 修改完成后的代码: using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using System.Threading; namespace App1 { [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { TextView tv1; Handler hander; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); Button button = FindViewById<Button>(Resource.Id.MyButton); hander = new UIHand(this); button.Click += delegate { TestThread(); }; tv1 = FindViewById<TextView>(Resource.Id.textView1); } //模拟一个线程,在线程中修改TextView的文本 private void TestThread() { Boolean loopFlag = true; Thread th = new Thread(new ThreadStart(delegate { int i = 0; while (loopFlag && i < 5) { if (i == 3) { Message ms = new Message(); ms.Obj = "测试赋值" + "@" + "123"; hander.SendMessage(ms); //调用HandleMessage方法 loopFlag = false; } i++; } })); th.Start(); } //创建一个类,继承于Handler private class UIHand : Handler { MainActivity ma; public UIHand(MainActivity _ma) { ma = _ma; } //重写HandleMessage方法 public override void HandleMessage(Message msg) { try { String result = msg.Obj + ""; //相当于ToString(); String[] str = result.Split('@'); ma.tv1.Text = str[0]; } catch (Exception) { } } } } } 这样问题就完美的解决了。
问题描述:使用byte转换成汉字编码格式,debug模式下可以正常运行,但是release模式下就会出现死机问题。 排除过程:最开始不知道是编码格式转换错误,于是把相关代码块注释掉,然后进行release运行,直到最后问题指向编码格式错误。 程序代码: String strData = System.Text.Encoding.GetEncoding("GB2312").GetString(data, 0, length); 解决方案:将其他受支持的编码勾选上CJK即可 使用C#开发Android出现的问题老是莫名其妙,网上也没有Xamarin.Android的相关文档,怕以后还会出现类似问题,便在这里记录下来,也希望大伙少走弯路。 最后再附上百度对CJK的解释: 中日韩统一表意文字(CJK Unified Ideographs),目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字(主要为汉字,但也有仿汉字如日本国字、韩国独有汉字、越南的喃字)于ISO 10646及Unicode标准内赋予相同编码。CJK 是中文(Chinese)、日文(Japanese)、韩文(Korean)三国文字的缩写。顾名思义,它能够支持这三种文字。实际上,CJK 能够支持在 LaTeX 中使用包括中文、日文、韩文在内的多种亚洲双字节文字。
/// <summary> /// 判断是否十六进制格式字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> public bool IsHexadecimal(string str) { const string PATTERN = @"[A-Fa-f0-9]+$"; return System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN); } /// <summary> /// 判断是否八进制格式字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> public bool IsOctal(string str) { const string PATTERN = @"[0-7]+$"; return System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN); } /// <summary> /// 判断是否二进制格式字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> public bool IsBinary(string str) { const string PATTERN = @"[0-1]+$"; return System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN); } /// <summary> /// 判断是否十进制格式字符串 /// </summary> /// <param name="str"></param> /// <returns></returns> public bool IsDecimal(string str) { const string PATTERN = @"[0-9]+$"; return System.Text.RegularExpressions.Regex.IsMatch(str, PATTERN); }
最近做项目需要winform嵌入unity的功能,由于完全没接触过这类嵌入的于是在网上搜,有一种方法是UnityWebPlayer插件,也开始琢磨了一段时间,不过一会发现在5.4版本以后这个东西就被淘汰了,所以果断放弃。后来有探索新方法,看到另一种使用代码实现的方法,又开始鼓捣,结果鼓捣完发现也存在问题,但是没有解决方案,于是有了这篇文章。 问题:鼠标在winform中操作unity没有反应。 对比:两台机器,A:win7 像素1440*900的老古董,B:win10 1920*1080的新科技。 得出结论:在A机器上不好使,在B上好使。 原因:屏幕分辨率惹的祸,unity的程序是1920*1080,放在A上可能会覆盖掉unity的本身操作,从而导致无效果。 解决办法:unity程序默认启动设置为全屏(去掉框框那种)。 就这个问题看似很好弄,可是菜鸟的我整整鼓捣两天,哎...。最开始以为是系统,插件,引用等问题,后来被一一排除,竟然是分辨率...,接下来看主要实现的代码。 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Windows.Forms; namespace demo { public class exetowinform { EventHandler appIdleEvent = null; Control ParentCon = null; string strGUID = ""; public exetowinform(Control C, string Titlestr) { appIdleEvent = new EventHandler(Application_Idle); ParentCon = C; strGUID = Titlestr; } /// <summary> /// 将属性<code>AppFilename</code>指向的应用程序打开并嵌入此容器 /// </summary> public IntPtr Start(string FileNameStr) { if (m_AppProcess != null) { Stop(); } try { ProcessStartInfo info = new ProcessStartInfo(FileNameStr); info.UseShellExecute = true; info.WindowStyle = ProcessWindowStyle.Minimized; m_AppProcess = System.Diagnostics.Process.Start(info); m_AppProcess.WaitForInputIdle(); Application.Idle += appIdleEvent; } catch { if (m_AppProcess != null) { if (!m_AppProcess.HasExited) m_AppProcess.Kill(); m_AppProcess = null; } } return m_AppProcess.Handle; } /// <summary> /// 确保应用程序嵌入此容器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void Application_Idle(object sender, EventArgs e) { if (this.m_AppProcess == null || this.m_AppProcess.HasExited) { this.m_AppProcess = null; Application.Idle -= appIdleEvent; return; } Thread.Sleep(300);//这里加阻塞 ,时间可以大些 Application.DoEvents(); if (m_AppProcess.MainWindowHandle == IntPtr.Zero) return; Application.Idle -= appIdleEvent; EmbedProcess(m_AppProcess, ParentCon); } /// <summary> /// 应用程序结束运行时要清除这里的标识 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void m_AppProcess_Exited(object sender, EventArgs e) { m_AppProcess = null; } /// <summary> /// 将属性<code>AppFilename</code>指向的应用程序关闭 /// </summary> public void Stop() { if (m_AppProcess != null)// && m_AppProcess.MainWindowHandle != IntPtr.Zero) { try { if (!m_AppProcess.HasExited) m_AppProcess.Kill(); } catch (Exception) { } m_AppProcess = null; } } #region 属性 /// <summary> /// application process /// </summary> Process m_AppProcess = null; /// <summary> /// 标识内嵌程序是否已经启动 /// </summary> public bool IsStarted { get { return (this.m_AppProcess != null); } } #endregion 属性 #region Win32 API [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)] private static extern long GetWindowLong(IntPtr hwnd, int nIndex); public static IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong) { if (IntPtr.Size == 4) { return SetWindowLongPtr32(hWnd, nIndex, dwNewLong); } return SetWindowLongPtr64(hWnd, nIndex, dwNewLong); } [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)] public static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll", SetLastError = true)] private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags); [DllImport("user32.dll", SetLastError = true)] private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)] private static extern bool PostMessage(IntPtr hwnd, uint Msg, uint wParam, uint lParam); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetParent(IntPtr hwnd); [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SWP_NOOWNERZORDER = 0x200; private const int SWP_NOREDRAW = 0x8; private const int SWP_NOZORDER = 0x4; private const int SWP_SHOWWINDOW = 0x0040; private const int WS_EX_MDICHILD = 0x40; private const int SWP_FRAMECHANGED = 0x20; private const int SWP_NOACTIVATE = 0x10; private const int SWP_ASYNCWINDOWPOS = 0x4000; private const int SWP_NOMOVE = 0x2; private const int SWP_NOSIZE = 0x1; private const int GWL_STYLE = (-16); private const int WS_VISIBLE = 0x10000000; private const int WM_CLOSE = 0x10; private const int WS_CHILD = 0x40000000; private const int SW_HIDE = 0; //{隐藏, 并且任务栏也没有最小化图标} private const int SW_SHOWNORMAL = 1; //{用最近的大小和位置显示, 激活} private const int SW_NORMAL = 1; //{同 SW_SHOWNORMAL} private const int SW_SHOWMINIMIZED = 2; //{最小化, 激活} private const int SW_SHOWMAXIMIZED = 3; //{最大化, 激活} private const int SW_MAXIMIZE = 3; //{同 SW_SHOWMAXIMIZED} private const int SW_SHOWNOACTIVATE = 4; //{用最近的大小和位置显示, 不激活} private const int SW_SHOW = 5; //{同 SW_SHOWNORMAL} private const int SW_MINIMIZE = 6; //{最小化, 不激活} private const int SW_SHOWMINNOACTIVE = 7; //{同 SW_MINIMIZE} private const int SW_SHOWNA = 8; //{同 SW_SHOWNOACTIVATE} private const int SW_RESTORE = 9; //{同 SW_SHOWNORMAL} private const int SW_SHOWDEFAULT = 10; //{同 SW_SHOWNORMAL} private const int SW_MAX = 10; //{同 SW_SHOWNORMAL} #endregion Win32 API /// <summary> /// 将指定的程序嵌入指定的控件 /// </summary> private void EmbedProcess(Process app, Control control) { // Get the main handle if (app == null || app.MainWindowHandle == IntPtr.Zero || control == null) return; try { // Put it into this form SetParent(app.MainWindowHandle, control.Handle); } catch (Exception) { } try { // Remove border and whatnot SetWindowLong(new HandleRef(this, app.MainWindowHandle), GWL_STYLE, WS_VISIBLE); SendMessage(app.MainWindowHandle, WM_SETTEXT, IntPtr.Zero, strGUID); } catch (Exception) { } try { // Move the window to overlay it on this window MoveWindow(app.MainWindowHandle, 0, 0, control.Width, control.Height, true); } catch (Exception) { } } [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); const int WM_SETTEXT = 0x000C; } } 调用方法: //panel1是在窗体中的控件名 exetowinform fr = new exetowinform(panel1, ""); //打开unity生成的exe文件 fr.Start(@"E:\Text.exe");
最近看到网上招聘有许多都需要WCF技术的人员,我之前一直没接触过这个东西,以后工作中难免会遇到,所谓笨鸟先飞,于是我就一探究竟,便有了这边文章。由于是初学WCF没有深入研究其原理,只是写了一个demo留着以后,如果哪里写的不对希望大佬们能指出批评。个人认为WCF类似于Web Services(类似,肯定是有区别的,至于啥区别可以搜搜资料),不多说了,接下来看我简单实现的demo吧。 WCF服务用于两个不同项目中的调用,在这里我举例项目A调用WCF服务实现查询数据功能。 第一步:创建数据库,有点数据能展示出来就行。 Create database SalesLibrary --创建库 Create table SalesVolume --创建表 ( Id int, Num int, Product varchar(20) ) 第二步:创建存储过程(可以没有此步,只是方便查询)。 create proc proc_ShowSalesVolume as select * from dbo.SalesVolume 第三步:创建一个WCF解决方案。 删除掉默认的Iservice1和Service1,创建自己的WCF服务名称。 第四步:编写WCF服务。 在IsalesVolumeOperation接口中写一个现实数据的方法ShowSalesVolume,一定要写上[OperationContract],如若不写外界无法对其进行调用。 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data; namespace WCFServices { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ISalesVolumeOperation”。 [ServiceContract] // 服务合同 即提供服务的接口或类 public interface ISalesVolumeOperation { [OperationContract] //服务契约 即提供服务的实现方法 DataTable ShowSalesVolume(); } } 在salesVolumeOperation中完善查询的的过程以及需要返回的参数。 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Data; using System.Data.SqlClient; namespace WCFServices { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“SalesVolumeOperation”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 SalesVolumeOperation.svc 或 SalesVolumeOperation.svc.cs,然后开始调试。 public class SalesVolumeOperation : ISalesVolumeOperation { public DataTable ShowSalesVolume() { DataSet ds = new DataSet(); SqlConnection con = new SqlConnection("data source=.;initial catalog=SalesLibrary;user id=sa;password=sa123"); string sql = "proc_ShowSalesVolume"; //存储过程名称 using (SqlCommand cmd = new SqlCommand(sql, con)) { con.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(ds); } return ds.Tables[0]; } } } 第五步:对WCF服务接口测试看看是否无误。 选中SalesVolumeOperation.svc右键在浏览器中查看,然后复制其路径。 打开测试工具SoapUI,将路径复制到initial WSDL 然后在路径结尾写上?wsdl。 接着开始进行测试: 看来WCF服务没有出现问题,那么我们就开始创建第二个程序来访问这个WCF服务。 第六步:创建ASP.NET Web 应用程序(和WCF不在同一个解决方案)。 选择空版本就行,然后右键服务-->添加服务引用-->高级-->添加web引用: 然后在解决方案中就可以看到: 第七步:实现调用WCF服务。 新建一个页面用于展示数据,名为ShowData.aspx 前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <%#Eval("Id") %> <%#Eval("Num") %> <%#Eval("Product") %> <br /> </ItemTemplate> </asp:Repeater> </div> </form> </body> </html> 后台代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; namespace WebUI { public partial class ShowData : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { GetSalesVolume(); } } private void GetSalesVolume() { SalesVolumeOperation.SalesVolumeOperation sa = new SalesVolumeOperation.SalesVolumeOperation(); //实例化WCF接口 DataTable dt = sa.ShowSalesVolume(); //接口下的方法 List<SalesVolume> list = new List<SalesVolume>(); SalesVolume sv; foreach(DataRow dr in dt.Rows) { sv = new SalesVolume(); sv.Id = Convert.ToInt32(dr["Id"]); sv.Num = Convert.ToInt32(dr["Num"]); sv.Product = dr["Product"].ToString(); list.Add(sv); } Repeater1.DataSource = list; Repeater1.DataBind(); } } public class SalesVolume { public int Id { get; set; } public int Num { get; set; } public string Product { get; set; } } } 最后页面上的展示结果: 好了,到这里就完事儿了,哪里写的不对希望大家指正~
命名空间: using System.Drawing; using System.Drawing.Imaging; /// <summary> /// 生成图片缩略文件 /// </summary> /// <param name="originalImage">图片源文件</param> /// <param name="width">缩略图宽度</param> /// <param name="height">缩略图高度</param> /// <param name="mode">生成缩略图的方式</param> /// <returns>缩率处理后图片文件</returns> public static System.Drawing.Image MakeThumbnail(System.Drawing.Image originalImage, int width, int height, ThumbnailModel mode) { int towidth = width; int toheight = height; int x = 0; int y = 0; int ow = originalImage.Width; int oh = originalImage.Height; switch (mode) { case ThumbnailModel.HighWidth: //指定高宽缩放(可能变形) break; case ThumbnailModel.Width: //指定宽,高按比例 toheight = originalImage.Height * width / originalImage.Width; break; case ThumbnailModel.Hight: //指定高,宽按比例 towidth = originalImage.Width * height / originalImage.Height; break; case ThumbnailModel.Default: //指定高,宽按比例 if (ow <= towidth && oh <= toheight) { x = -(towidth - ow) / 2; y = -(toheight - oh) / 2; ow = towidth; oh = toheight; } else { if (ow > oh)//宽大于高 { x = 0; y = -(ow - oh) / 2; oh = ow; } else//高大于宽 { y = 0; x = -(oh - ow) / 2; ow = oh; } } break; case ThumbnailModel.Auto: if (originalImage.Width / originalImage.Height >= width / height) { if (originalImage.Width > width) { towidth = width; toheight = (originalImage.Height * width) / originalImage.Width; } else { towidth = originalImage.Width; toheight = originalImage.Height; } } else { if (originalImage.Height > height) { toheight = height; towidth = (originalImage.Width * height) / originalImage.Height; } else { towidth = originalImage.Width; toheight = originalImage.Height; } } break; case ThumbnailModel.Cut: //指定高宽裁减(不变形) if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight) { oh = originalImage.Height; ow = originalImage.Height * towidth / toheight; y = 0; x = (originalImage.Width - ow) / 2; } else { ow = originalImage.Width; oh = originalImage.Width * height / towidth; x = 0; y = (originalImage.Height - oh) / 2; } break; default: break; } //新建一个bmp图片 System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight); //新建一个画板 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap); //设置高质量插值法 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量,低速度呈现平滑程度 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //清空画布并以透明背景色填充 g.Clear(System.Drawing.Color.White); //在指定位置并且按指定大小绘制原图片的指定部分 g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel); return bitmap; } /// <summary> /// 缩率图处理模式 /// </summary> public enum ThumbnailModel { /// <summary> /// 指定高宽缩放(可能变形) /// </summary> HighWidth, /// <summary> /// 指定宽,高按比例 /// </summary> Width, /// <summary> /// 默认 全图不变形 /// </summary> Default, /// <summary> /// 指定高,宽按比例 /// </summary> Hight, /// <summary> /// 指定高宽裁减(不变形)??指定裁剪区域 /// </summary> Cut, /// <summary> /// 自动 原始图片按比例缩放 /// </summary> Auto }
命名空间: using System.Drawing.Imaging; using System.Drawing; using System.Drawing.Drawing2D; #region GetPicThumbnail /// <summary> /// 无损压缩图片 /// </summary> /// <param name="sFile">原图片</param> /// <param name="dFile">压缩后保存位置</param> /// <param name="dHeight">高度</param> /// <param name="dWidth">宽度</param> /// <param name="flag">压缩质量 1-100</param> /// <returns></returns> public bool GetPicThumbnail(string sFile, string dFile, int dHeight, int dWidth, int flag) { System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile); ImageFormat tFormat = iSource.RawFormat; int sW = 0, sH = 0; //按比例缩放 Size tem_size = new Size(iSource.Width, iSource.Height); if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号 { if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth)) { sW = dWidth; sH = (dWidth * tem_size.Height) / tem_size.Width; } else { sH = dHeight; sW = (tem_size.Width * dHeight) / tem_size.Height; } } else { sW = tem_size.Width; sH = tem_size.Height; } Bitmap ob = new Bitmap(dWidth, dHeight); Graphics g = Graphics.FromImage(ob); g.Clear(Color.WhiteSmoke); g.CompositingQuality = CompositingQuality.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel); g.Dispose(); //以下代码为保存图片时,设置压缩质量 EncoderParameters ep = new EncoderParameters(); long[] qy = new long[1]; qy[0] = flag;//设置压缩的比例1-100 EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy); ep.Param[0] = eParam; try { ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders(); ImageCodecInfo jpegICIinfo = null; for (int x = 0; x < arrayICI.Length; x++) { if (arrayICI[x].FormatDescription.Equals("JPEG")) { jpegICIinfo = arrayICI[x]; break; } } if (jpegICIinfo != null) { ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径 } else { ob.Save(dFile, tFormat); } return true; } catch { return false; } finally { iSource.Dispose(); ob.Dispose(); } } #endregion
前言: 使用Echarts展示图表效果,在这里只做了四种案例:折线、柱状、圆形、雷达。当初是一位朋友用到Echarts展示数据,他没有太多时间弄,所以我就帮他搞出来,当初刚接触的时候也是一头雾水,不知道该怎么下手,网上类似的案例有也不多,并且不是自己想要的效果。正好今天整理电脑时候发现还有实现的案例,就放在自己的博客上留着以后用。 实现步骤: 既然说到了动态数据,当然离不开查询,我在这用SQL Server建一个简单的库,只为展示其效果。 看到数据大家伙都知道这是一个车品牌的图例(说了一句废话^_^),接下来开始画前台页面,效果大概是这个样子的: 当然这是根据个人爱好,我喜欢比较规整的东西,所以就浪费了一些时间画出一个样式。 css样式代码: body,ul,li,div,a,span{ margin:auto; } .btnChart{ width:750px; height:40px; margin:0 auto; } .BarFigure { BACKGROUND: url(/chartImg/column3d.gif) no-repeat 4px 4px; } .RadarFigure { BACKGROUND: url(/chartImg/leidatu.gif) no-repeat 4px 4px; } .PieFigure { BACKGROUND: url(/chartImg/pie.gif) no-repeat 4px 4px; } .LineFigure { BACKGROUND: url(/chartImg/donut.gif) no-repeat 4px 4px; } .btnChart ul li{ text-decoration:none; border:1px solid gray; padding:5px; border-radius:5px; color:#000; font-size:14px; font-family:'楷体'; float:right;list-style:none; margin-left:10px; } .btnChart ul li:hover { color: orange; cursor:pointer; } .Line { border-bottom: 1px solid #e1e1e1; width: 750px; margin: 0 auto; } .ChartStyle{ width:800px; height:500px; border:1px solid gray; margin:0 auto; display:none; } html代码: <body> <div style="height:600px;width:1000px;margin:0 auto; border:1px solid gray"> <br /> <div class="btnChart" > <ul> <li class='RadarFigure'>&nbsp; 雷达图 </li> <li class='PieFigure'>&nbsp; 饼状图 </li> <li class='BarFigure'>&nbsp; 柱状图 </li> <li class='LineFigure'>&nbsp; 折线图 </li> </ul> </div> <div class="showCharArray"> <div class=" ChartStyle" > <%--折线图--%> <div id="Line" style="width:800px; height:450px;margin-top:30px;" ></div> </div> <div class="ChartStyle" > <%--柱状图--%> <div id="Bar" style="width:800px; height:450px;margin-top:30px;"></div> </div> <div class="ChartStyle"> <%--饼状图--%> <div id="Pie" style="width:800px; height:450px;margin-top:30px;"></div> </div> <div class="ChartStyle"> <%--雷达图--%> <div id="Radar" style="width:800px; height:450px;margin-top:30px;"></div> </div> </div> </div> </body> 接下来开始做Echarts的准备工作啦,先从官网下载echarts.min.js 链接:http://echarts.baidu.com/download.html ,jquery.js我就不说啦。 <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <%--jquery.js--%> <script src="Scripts/echarts.min.js" type="text/javascript"></script> <%-- Echarts.js --%> <link href="css/ChartPage.css" rel="stylesheet" type="text/css" /> <%--引用的css样式--%> 前台写的差不多了,我们开始写查询数据。 static string conStr = ConfigurationManager.ConnectionStrings["conStr"].ToString(); public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string sql = @" select Id,Num,Product from SalesVolume"; //SQL语句 DataTable dt = ExecuteDataTable(sql,CommandType.Text,null); //查询结果 List<object> lists = new List<object>(); //创建object类型的泛型 foreach (DataRow dr in dt.Rows) { var obj = new { name = dr["Product"], value = dr["Num"] }; //key,value lists.Add(obj); } var jsS = new JavaScriptSerializer(); //创建json对象 context.Response.Write(jsS.Serialize(lists)); //返回数据 } public DataTable ExecuteDataTable(string sql, CommandType type, params SqlParameter[] pars) { DataSet ds = new DataSet(); DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(conStr)) { con.Open(); SqlCommand cmd = new SqlCommand(sql, con); cmd.CommandType = type; if (pars != null) { cmd.Parameters.AddRange(pars); } SqlDataAdapter adpt = new SqlDataAdapter(cmd); adpt.Fill(ds); dt = ds.Tables[0]; } return dt; } 后台查询也很简单,只要能返回key和value值就可以了。前台的js直接上代码吧,差不多都能看懂。 $(function () { $("select").addClass("form-control"); $(".LineFigure").click(function () { var $content = $(this).parent().parent().next().children("div:nth-child(1)"); if ($content.is(":visible")) { $(this).css({ "color": "#000", "border-color": "gray" }); $content.html(""); $content.hide(); } else { $(this).css({ "color": "orange", "border-color": "orange" }); $(this).siblings().css({ "color": "#000", "border-color": "gray" }); $content.siblings().hide(); var newElement = $('<div id="Line" style="width:800px; height:450px;margin-top:30px;" ></div> '); $content.append(newElement); //-----------上下都是设置样式的可以无视掉,这里才是核心-------------------- $.ajax({ url: "ashx/Echarts.ashx", data: { cmd: "bar" }, cache: false, async: false, dataType: "json", success: function (data) { if (data) { var list = eval(data); var name = []; //Line的数据需要object类型,所以创建name和value数组存放数据 var value = []; for (var i = 0; i < list.length; i++) { name.push(list[i].name); value.push(list[i].value); } LineChart(name, value); //调用封装好的Line } }, error: function (msg) { alert("系统发生错误"); } }); //--------------------------------------------------------------------------- $content.show(); } }) $(".BarFigure").click(function () { var $content = $(this).parent().parent().next().children("div:nth-child(2)"); if ($content.is(":visible")) { $(this).css({ "color": "#000", "border-color": "gray" }); $content.html(""); $content.hide(); } else { $(this).css({ "color": "orange", "border-color": "orange" }); $(this).siblings().css({ "color": "#000", "border-color": "gray" }); $content.siblings().hide(); var newElement = $('<div id="Bar" style="width:800px; height:450px;margin-top:30px;" ></div> '); $content.append(newElement); //-----------上下都是设置样式的可以无视掉,这里才是核心-------------------- $.ajax({ url: "ashx/Echarts.ashx", data: { cmd: "bar" }, cache: false, async: false, dataType: "json", success: function (data) { if (data) { var list = eval(data); var name = []; var value = []; for (var i = 0; i < list.length; i++) { name.push(list[i].name); value.push(list[i].value); } BarChart(name, value); //调用封装好的BarChart } }, error: function (msg) { alert("系统发生错误"); } }); //--------------------------------------------------------------------------- $content.show(); } }) $(".PieFigure").click(function () { var $content = $(this).parent().parent().next().children("div:nth-child(3)"); if ($content.is(":visible")) { $(this).css({ "color": "#000", "border-color": "gray" }); $content.html(""); $content.hide(); } else { $(this).css({ "color": "orange", "border-color": "orange" }); $(this).siblings().css({ "color": "#000", "border-color": "gray" }); $content.siblings().hide(); var newElement = $('<div id="Pie" style="width:800px; height:450px;margin-top:30px;" ></div> '); $content.append(newElement); //-----------上下都是设置样式的可以无视掉,这里才是核心-------------------- $.ajax({ url: "ashx/Echarts.ashx", data: { cmd: "bar" }, cache: false, async: false, dataType: "json", success: function (data) { if (data) { var list = eval(data); var name = []; var value = []; for (var i = 0; i < list.length; i++) { name.push(list[i].name); value.push(list[i].value); } PieChart(data, name); // 圆形不同的是数据类型是这样的:{value:335, name:'直接访问'},{value:310, name:'邮件营销'},{value:234, name:'联盟广告'} } }, error: function (msg) { alert("系统发生错误"); } }); //--------------------------------------------------------------------------- $content.show(); } }) $(".RadarFigure").click(function (e) { var $content = $(this).parent().parent().next().children("div:nth-child(4)"); if ($content.is(":visible")) { $(this).css({ "color": "#000", "border-color": "gray" }); $content.html(""); $content.hide(); } else { $(this).css({ "color": "orange", "border-color": "orange" }); $(this).siblings().css({ "color": "#000", "border-color": "gray" }); $content.siblings().hide(); var newElement = $('<div id="Radar" style="width:800px; height:450px;margin-top:30px;" ></div> '); $content.append(newElement); //-----------上下都是设置样式的可以无视掉,这里才是核心-------------------- $.ajax({ url: "ashx/Echarts.ashx", data: { cmd: "bar" }, cache: false, async: false, dataType: "json", success: function (data) { if (data) { var list = eval(data); var name = []; var value = []; for (var i = 0; i < list.length; i++) { name.push(list[i].name); value.push(list[i].value); } RadarChart(name, value, data); //调用封装好的RadarChart } }, error: function (msg) { alert("系统发生错误"); } }); //--------------------------------------------------------------------------- $content.show(); } }) }) View Code <script type="text/javascript"> //封装好的图表类,传入数据即可 function LineChart(name, value) { var myChart = echarts.init(document.getElementById('Line')); // 指定图表的配置项和数据 var option = { title: { text: '汽车销量统计', subtext: '纯属虚构', x: 'center' }, tooltip: {}, xAxis: { data: name //恒坐标的值name }, yAxis: {}, series: [{ name: '销量', type: 'line', data: value //纵坐标的值value }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); } function BarChart(name,value) { var myChart = echarts.init(document.getElementById('Bar')); // 指定图表的配置项和数据 var option = { title: { text: '汽车销量统计', subtext: '纯属虚构', x: 'center' }, tooltip: {}, xAxis: { data: name }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: value }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); } function PieChart(data,name) { var myChart = echarts.init(document.getElementById('Pie')); option = { title: { text: '汽车销量统计', subtext: '纯属虚构', x: 'center' }, tooltip: { trigger: 'item', formatter: "{a} <br/>{b} : {c} ({d}%)" }, legend: { orient: 'vertical', left: 'left', data: name }, series: [{ name: '访问来源', type: 'pie', radius: '55%', center: ['50%', '60%'], data: data, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } }] }; myChart.setOption(option); } function RadarChart(name,value,data) { var myChart = echarts.init(document.getElementById('Radar')); option = { title: { text: '汽车销量统计(纯属虚构)', subtext: '纯属虚构', x: 'right', y: 'bottom' }, tooltip: { trigger: 'item', backgroundColor: 'rgba(0,0,250,0.2)' }, legend: { data: name }, visualMap: { color: ['red', 'yellow'] }, radar: { indicator: (function () { var indicator = []; for (var i = 0; i < name.length; i++) { indicator.push({ text: name[i], max: 4000 //限制最大数数值 }) } return indicator; })() }, series: (function () { var series = []; for (var i = 0; i < data.length; i++) { series.push({ type: 'radar', symbol: 'none', itemStyle: { normal: { lineStyle: { width: 1 } }, emphasis: { areaStyle: { color: 'rgba(0,250,0,0.3)' } } }, data: [ { value: value, name: name[i] } ] }); } return series; })() }; myChart.setOption(option); } </script> View Code 到这里功能都能实现了,给大家展示一下我的成品,前端编写能力有些差,大伙凑合的看吧^_^。 本文到这里就完事儿了,当然哪里写的不好大神可以加以点评,欢迎拍砖扶正,共同进步^_^~
前言: 最近做了一个项目,程序A在一个服务器程序B在另一台服务器,然而主程序A需要访问程序B的图片集文件夹下载到本服务器上,为了防止多次对Web Services进行调用,在主程序A中创建一个XML文件用于记录图片集中的某张图片是否下载过,如果下载就不需调用,没下载就需要调用服务。我也是枚小菜鸟,之前重来没写过XML文件这一块,于是翻书(C# 高级编程 第10版 Christian Nagel著)上网查资料,终于整理出来一套自己能用得上对XML读写等操作的笔记。为了学习和分享决定放在自己的博客中,以后遇到类似问题可以进行巩固,如果那里写的有误希望读者留言加以改正,接下来看我实现的步骤。 需要引用的命名空间: using System.IO; using System.Xml; 1.创建XML文件 private void createXml(string xmlPath) //创建train的xml文件 { if (!File.Exists(xmlPath)) //判断是否创建过xml文件 { XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version='1.0' encoding='gb2312' ?>" + "<train>" + "</train>"); doc.Save(xmlPath); } } 2.插入元素 private void addXmlNode(string BatchId, string BatchName, string BatchNo,string xmlPath) //增加节点 (培训批次id,培训批次名称,图片编号集合,XML路径) { XmlDocument xmldoc = new XmlDocument(); //实例一个xml文件 xmldoc.Load(xmlPath); //读取xml文件 XmlNode train = xmldoc.SelectSingleNode("train"); //查找train XmlElement el = xmldoc.CreateElement("trainbatch"); //创建一个trainbatch el.SetAttribute("Name", BatchName); //添加属性 XmlElement elBatchId = xmldoc.CreateElement("BatchId"); //创建<trainbatch>节点的第一个下级节点 elBatchId.InnerText = BatchId; //赋值 el.AppendChild(elBatchId); //追加到trainbatch下 XmlElement elBatchName = xmldoc.CreateElement("BatchName"); elBatchName.InnerText = BatchName; el.AppendChild(elBatchName); XmlElement elBatchNo = xmldoc.CreateElement("BatchNo"); //创建<trainbatch>节点的第二个下级节点 elBatchNo.InnerText = BatchNo; //赋值 el.AppendChild(elBatchNo); //追加到trainbatch下 train.AppendChild(el); //所有添加元素追加到根目录下 xmldoc.Save(xmlPath); } 3.修改第一个trainbatch节点下的BatchNo的值 private void updateXmlNode(string BatchId, string BatchNo,string xmlPath) //修改xml文件 (培训批次id,将要修改的图片编号集合,XML路径) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(xmlPath); XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) //循环所有trainbatch节点 { XmlElement el = (XmlElement)node.ChildNodes[0]; //获取第一个节点值 if (el.InnerText == BatchId) //判断第一个trainbatch的id是否等于将要修改的id { node.ChildNodes[2].InnerText = BatchNo; //给第三个节点赋值 xmldoc.Save(xmlPath); //保存(不要忘记这步骤哦) break; } } } 4.获取第一个trainbatch节点下的BatchNo值 private string getXmlNodeValue(string BatchId,string xmlPath) //获取某次培训是否记录在xml { XmlDocument xmldoc = new XmlDocument(); //实例化XML文档 xmldoc.Load(xmlPath); //加载将要打开的文档 string result = ""; XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) //循环所有的trainbatch节点 { XmlElement el = (XmlElement)node.ChildNodes[0]; //获取trainbatch下的第一个节点元素 if (el.InnerText == BatchId) { result = node.ChildNodes[2].InnerText.ToString(); //返回trainbatch下的第三个节点元素 return result; } } return result; } 5.根据条件删除trainbatch节点 private void deleteXmlNode(string BatchName, string xmlPath) //删除某个节点元素 { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(xmlPath); XmlNodeList titleNodes = xmldoc.SelectSingleNode("train").ChildNodes; //获取train下一层的节点 foreach (XmlNode node in titleNodes) { XmlElement el = (XmlElement)node; if (el.GetAttribute("Name") == BatchName) //el.GetAttribute 获取trainbatch属性 { el.RemoveAll(); //删除当前元素和所有子元素 xmldoc.Save(xmlPath); break; } } } 6.XML转义字符 &lt; < 小于 &gt; > 大于 &amp; & 和号 &apos; ' 单引号 &quot; " 引号 最后分享一下调用方法的代码部分: protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { string xmlPath = Server.MapPath("TestXml.xml"); //XML路径地址 createXml(xmlPath); //创建XML文件 addXmlNode("1", "ASP.NET培训第一期", "123,134,454,789,454,315,456", xmlPath); //插入第一个节点 addXmlNode("2", "ASP.NET培训第二期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第二个节点 addXmlNode("3", "ASP.NET培训第三期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第三个节点 addXmlNode("4", "ASP.NET培训第四期", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //插入第四个节点 string result = getXmlNodeValue("1", xmlPath); //获取节点值 updateXmlNode("1", "0123,0134,0454,0789,0454,0315,0456", xmlPath); //修改节点值 deleteXmlNode("ASP.NET培训第二期", xmlPath); //删除节点 } }
.NET 实现DES加密解密处理 using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string a1 = EncryptDES("123123123123"); Console.WriteLine(a1); string a2 = DecryptDES(a1); Console.WriteLine(a2); Console.Read(); } //默认密钥向量 private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; //默认加密密码 private static string DefEncryptKey = "consmkey"; /// <summary> /// DES加密字符串 /// </summary> /// <param name="encryptString">待加密的字符串</param> /// <returns>加密成功返回加密后的字符串,失败返回源串</returns> public static string EncryptDES(string encryptString) { return EncryptDES(encryptString, DefEncryptKey); } /// <summary> /// DES解密字符串 /// </summary> /// <param name="decryptString">待解密的字符串</param> /// <returns>解密成功返回解密后的字符串,失败返源串</returns> public static string DecryptDES(string decryptString) { return DecryptDES(decryptString, DefEncryptKey); } /// <summary> /// DES加密字符串 /// </summary> /// <param name="encryptString">待加密的字符串</param> /// <param name="encryptKey">加密密钥,要求为8位</param> /// <returns>加密成功返回加密后的字符串,失败返回源串</returns> public static string EncryptDES(string encryptString, string encryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); byte[] rgbIV = Keys; byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray()); } catch { return encryptString; } } /// <summary> /// DES解密字符串 /// </summary> /// <param name="decryptString">待解密的字符串</param> /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param> /// <returns>解密成功返回解密后的字符串,失败返源串</returns> public static string DecryptDES(string decryptString, string decryptKey) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey); byte[] rgbIV = Keys; byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray()); } catch { return decryptString; } } } }
.NET 实现Base-64加密解密处理 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string a1 = EncodeBase64("Base-64加密解密测试"); Console.WriteLine(a1); string a2 = DecodeBase64(a1); Console.WriteLine(a2); Console.Read(); } /// <summary> /// Base64加密 /// </summary> /// <param name="codeName">加密采用的编码方式</param> /// <param name="source">待加密的明文</param> /// <returns></returns> public static string EncodeBase64(Encoding encode, string source) { string enString = ""; byte[] bytes = encode.GetBytes(source); try { enString = Convert.ToBase64String(bytes); } catch { enString = source; } return enString; } /// <summary> /// Base64加密,采用utf8编码方式加密 /// </summary> /// <param name="source">待加密的明文</param> /// <returns>加密后的字符串</returns> public static string EncodeBase64(string source) { return EncodeBase64(Encoding.UTF8, source); } /// <summary> /// Base64解密 /// </summary> /// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param> /// <param name="result">待解密的密文</param> /// <returns>解密后的字符串</returns> public static string DecodeBase64(Encoding encode, string result) { string decode = ""; byte[] bytes = Convert.FromBase64String(result); try { decode = encode.GetString(bytes); } catch { decode = result; } return decode; } /// <summary> /// Base64解密,采用utf8编码方式解密 /// </summary> /// <param name="result">待解密的密文</param> /// <returns>解密后的字符串</returns> public static string DecodeBase64(string result) { return DecodeBase64(Encoding.UTF8, result); } } }
开始以为SerializerHelper类是项目中已包含的,后来在别的解决方案中测试代码才发现SerializerHelper类是自己写的。 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Xml.Serialization; using Newtonsoft.Json; /// <summary> /// SerializerHelper 的摘要说明 /// </summary> public static class SerializerHelper { /// <summary> /// 反序列化XML文件 /// </summary> public static T LoadFromXmlFile<T>(string filepath) where T : class { using (FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(stream); } } /// <summary> /// 反序列化XML字符串 /// </summary> public static T LoadFromXmlString<T>(string xml) where T : class { XmlSerializer serializer = new XmlSerializer(typeof(T)); byte[] bytes = Encoding.UTF8.GetBytes(xml); using (MemoryStream stream = new MemoryStream(bytes)) { return (T)serializer.Deserialize(stream); } } /// <summary> /// 序列化XML对象 /// </summary> public static string SaveToXmlString<T>(T entity) where T : class { using (MemoryStream stream = new MemoryStream()) { XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(stream, entity); return Encoding.UTF8.GetString(stream.ToArray()); } } /// <summary> /// 序列化Json对象 /// </summary> public static string ToJsonString(object obj) { return ToJsonString<object>(obj); } /// <summary> /// 序列化Json对象 /// </summary> public static string ToJsonString<T>(T obj) where T : class { string text = JsonConvert.SerializeObject(obj); return text; } /// <summary> /// 反序列化Json字符串 /// </summary> public static T ToJsonObject<T>(string text) where T : class { T obj = (T)JsonConvert.DeserializeObject(text, typeof(T)); return obj; } } Newtonsoft.Json.dll的下载地址(找了半天不知道在哪里添加附件所以只能放我上传的路径了): https://files.cnblogs.com/files/swjian/Newtonsoft.Json.rar
上次总结使用DataTable返回多个值,后来看到一个小哥的返回方式和我的有所不同,便留意了一下。原来他构造一个Class,而我构造的是一个Table。 首先说说两者的区别:拿student举例,student1有学号,姓名,成绩,student2,student3...都有该属性。如果想返回多个student的信息,那么就可以构造一个datatable来进行返回,如果只需要返回student1的信息则构造一个Class就可以解决。 接下来看代码: 在script中写一个ajax用于接收返回来的数据,代码如下。 <script type="text/javascript"> $(function () { $.ajax({ type:"post", url:"ashx/PersonnelRegistrationForm.ashx", success:function(data){ var datainfo = $.parseJSON(data); alert(datainfo.OrderNo); alert(datainfo.RowGuid); alert(datainfo.ResultNum); } }) }) </script> 然后在名为PersonnelRegistratinForm一般处理程序进行数据处理,然后构造所需要的值将其返回。 public void ProcessRequest(HttpContext context) { ResultData r = new ResultData(); r.OrderNo = "WP201711200001"; r.RowGuid = "{ba16ad7e-9b64-4d77-bba0-b32a69294ae5}"; r.ResultNum = 1; string json = SerializerHelper.ToJsonString(r); context.Response.Write(json); context.Response.End(); } 构造名为ResultData的class public class ResultData { public string OrderNo { get; set; } public string RowGuid { get; set; } public int ResultNum { get; set; } }
url出现了有+,空格,/,?,%,#,&,= 等特殊符号的时候,可能在服务器端无法获得正确的参数值。 案例: <img src="BarCode39.aspx?barcodevalue=http://www.baidu.com.cn:8066/order/InputTrainingInfo_kcsj.aspx?TrainId=1&TrainMoney=900&t=2&w=500&h=500" id="imgEWM"/> 如果我们想让barcodevalue的参数是http://www.baidu.com.cn:8066/order/InputTrainingInfo_kcsj.aspx?TrainId=1&TrainMoney=900,&t=2,&w=500,&h=500的情况下我们需要对等号进行转义,否则服务器端会默认把barcodevalue=http://www.baidu.com.cn:8066/order/InputTrainingInfo_kcsj.aspx?,TrainId=1,TrainMoney=900,&t=2,&w=500,&h=500。 特殊符号转义码如下: 符号 url中转义结果 转义码 + URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20 / 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊字符 %25 # 表示书签 %23 & URL 中指定的参数间的分隔符 %26 = URL 中指定参数的值 %3D 转义后代码: <img src="BarCode39.aspx?barcodevalue=http://www.baidu.com.cn:8066/order/InputTrainingInfo_kcsj.aspx?TrainId%3D1%26TrainMoney%3D900&t=2&w=500&h=500" id="imgEWM"/>
先展示通过动态添加控件的结果: 实现步骤: 1.引用js文件 <script src="Script/jquery-1.5.1.min.js" type="text/javascript"></script> 2.引用BootStrap(纯属为了控件好看) <link href="css/bootstrap.css" rel="stylesheet" /> 3.画一个Table控件用于存放按钮 控件 <table id="tabConten" cellpadding="10" cellspacing="0"> <tr> <td style=" border-left-width:0px;" colspan="5" > <input type="button" value="添加人员" style="margin-right:0px;" onclick="add()" class="btn btn-info"/> <input id="btn_save" type="button" value="查看" class="btn btn-success" onclick="query()"/> </td> </tr> <tr class="addPersonTh"> <td class="tdFontW tdCos_01"><span style="color: #F00" class="tdAlignL">*</span>&nbsp;姓名</td> <td class="tdFontW tdCos_02"><span style="color: #F00" class="tdAlignL">*</span>&nbsp;性别</td> <td class="tdFontW tdCos_03"><span style="color: #F00" class="tdAlignL">*</span>&nbsp;手机</td> <td class="tdFontW tdCos_04"><span style="color: #F00" class="tdAlignL">*</span>&nbsp;邮箱</td> <td class="tdFontW tdCos_05">操作</td> </tr> <tr class="addPerson"> <td> <span class="span_none">A: &nbsp;&nbsp; </span> <input type="text" maxlength="10" /> </td> <td> <select class="sex_style"> <option value="1">男</option> <option value="0">女</option> </select> </td> <td><input type="text" maxlength="11" /></td> <td><input type="text" maxlength="50" /></td> <td><a href="#" class="del">删除</a></td> </tr> </table> 4.设置布局样式 <style type="text/css"> #index /* 全局样式 */ { margin:0 auto; padding:0 auto; width:900px; /*border:1px solid red;*/ font-size:15px; } #tabConten{ /* 表格样式 */ margin:0 auto; border-collapse: collapse; text-align:center; } #tabConten tr td{ /* 表格内td设置 */ border:0px solid gray; } .sex_style /* 设置性别下拉框样式 */ { width:70px; } </style> 5.编写js脚本 <script type="text/javascript"> /* 增加tr行 */ var num = 1; //全局变量 默认为一组控件 function add() { /* 增加人员行 */ num++; var str = String.fromCharCode(64 + num); var $tr = $("<tr class=\"addPerson\"><td><span class=\"span_none\"> " + str + ": &nbsp;&nbsp; </span><input type=\"text\" maxlength=\"10\"/></td><td><select class=\"sex_style\" ><option value=\"1\">男</option><option value=\"0\">女</option></select></td><td><input type=\"text\" maxlength=\"11\" /></td><td><input type=\"text\" maxlength=\"50\"/></td><td><a href=\"#\" class=\"del\">删除</a></td></tr>"); var $parent; if (num == 1) { $parent = $("table tr:.addPersonTh"); //num默认为1 如果当前没元素就在标题后添加 } else { $parent = $("table tr:.addPerson:eq(" + (num - 2) + ")"); //num默认为1 进入add事件首先将num+1,所以此处要获取在哪里添加元素需-2 } $parent.after($tr); init(); } function query() { /* 获取人员行 */ for (var i = 0; i < num; i++) { for (var j = 0; j < 4; j++) { if (j == 1) { alert("第"+(i+1)+"行第"+(j+1)+"的值是:"+$("table tr:.addPerson:eq(" + i + ") td:eq(" + j + ") select:.sex_style option:selected").val()); } else { alert("第"+(i+1)+"行第"+(j+1)+"的值是:"+$("table tr:.addPerson:eq(" + i + ") td:eq(" + j + ") :text").val()); } } } } function init() { /* 删除人员行 */ $("table tr td a.del").unbind("click").click(function () { $(this).parent().parent().remove(); for (var i = 0; i < num - 1; i++) { var str = String.fromCharCode(65 + i) + ":"; $("table tr:.addPerson:eq(" + i + ") span").html(str); } num--; }); } </script> 其中追加的位置可分为四种,根据实际需求使用。 append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容
有时候我们使用Ajax链接一般处理程序需要返回多个值,然而这些数据并非在一个查询表内,此时便想到构造一个虚拟的DataTable,这样就可以返回多个值了(当然有很多办法,这是其中一种 )。 首先我们需要准备一个 script 和一个 ashx 文件。 在script中写一个ajax用于接收返回来的数据,代码如下。 <script type="text/javascript"> $(function () { $.ajax({ type: "post", //提交方式 url: "/ashx/PersonnelRegistrationForm.ashx", //一般处理程序的路径 data: { corpName: corpName, corpCode: corpCode }, //向后台传入的值 success: function (data) { //返回成功后将要做的事,这里是返回一个表 var datainfo = $.parseJSON(data); alert(datainfo[0].OrderNo); alert(datainfo[0].RowGuid); alert(datainfo[0].ResultNum); }, error: function () { alert('系统发生错误'); } }); }) </script> 然后在名为PersonnelRegistratinForm一般处理程序进行数据处理,然后构造所需要的值将其返回。 #region 构造返回的表 DataTable table = new DataTable(); //构造表 DataColumn column1 = new DataColumn("ResultNum", Type.GetType("System.Int32")); //构造列及所对应的类型 DataColumn column2 = new DataColumn("OrderNo", Type.GetType("System.String")); DataColumn column3 = new DataColumn("RowGuid", Type.GetType("System.String")); table.Columns.Add(column1); //将列添加到table表中 table.Columns.Add(column2); table.Columns.Add(column3); DataRow dr = table.NewRow(); //table表创建行 dr["ResultNum"] = person_result; dr["OrderNo"] = OrderNo; dr["RowGuid"] = t_ROWGUID; table.Rows.Add(dr); //将数据加入到table表中 string json = SerializerHelper.ToJsonString(table); //序列化json对象 context.Response.Write(json); context.Response.End(); #endregion 构造table时可以使用简便写法: DataTable table = new DataTable(); //构造表 table.Columns.Add("ResultNum", Type.GetType("System.Int32")); table.Columns.Add("OrderNo", Type.GetType("System.String")); table.Columns.Add("RowGuid", Type.GetType("System.String")); DataRow dr = table.NewRow(); //table表创建行 dr["ResultNum"] = person_result; dr["OrderNo"] = OrderNo; dr["RowGuid"] = t_ROWGUID; table.Rows.Add(dr); //将数据加入到table表中 这样前台的ajax就可以获取到返回过去的table了。当然别忘记引用命名空间 using System.Data; using System.Data.SqlClient; using System.Text;
根据下来列表来动态显示TabControl下的元素 需要准备两个控件:Combobox (命名为:cbPrjType)和 TabControl (命名为:tabPrjType),TabControl下面有六个子元素分别是:tabPage1,tabPage2,tabPage3,tabPage4,tabPage5,tabPage6 我们可以想到加载界面的时候会给cbPrjType绑定元素,代码如下: private void InitProjectTypeDic() //绑定下拉值 { string strMsg = ""; CorpProjectAddClass cpas = new CorpProjectAddClass(); dsDic = cpas.GetDicDataSet(out strMsg); //查询定义的字典表 if (dsDic.Tables["XMBL_TbProjectTypeDic_SZ"] != null) { this.cbPrjType.Items.Clear(); //清空集合元素 this.cbPrjType.Items.Add(new MyItem("", "")); //为第一个option添加为空 foreach (DataRow dr in dsDic.Tables["XMBL_TbProjectTypeDic_SZ"].Rows) { this.cbPrjType.Items.Add(new MyItem(dr["ProjectTypeNum"].ToString(), dr["ProjectTypeName"].ToString())); } this.cbPrjType.DisplayMember = "Name"; //显示的属性(显示) this.cbPrjType.ValueMember = "ID"; //选项中实际的值(隐藏) this.cbPrjType.SelectedIndex = 0; //默认选中第一个 } } 其次给cbPrjType添加改变下拉事件SelectedIndexChanged: private void cbPrjType_SelectedIndexChanged(object sender, EventArgs e) { string cbVal=""; //记录当前选中下拉的值 if (cbPrjType.SelectedItem != null && (cbPrjType.SelectedItem as MyItem).ID != "") cbVal = (cbPrjType.SelectedItem as MyItem).Name; //获取选中下拉的值 else return; this.tabPage1.Parent = null; //指定tabPage1的父元素为空(可实现隐藏作用) this.tabPage2.Parent = null; this.tabPage3.Parent = null; this.tabPage4.Parent = null; this.tabPage5.Parent = null; this.tabPage6.Parent = null; JempType(cbVal); //传入选中的值,从而判断显示哪个tabPage } 根据选中元素的值来进行判断: private void JempType(string prjType) { switch (prjType) { case "城市道路工程": this.tabPage1.Text = "城市道路工程"; //tabPage显示的名称 this.tabPage1.Parent = tabPrjType; //给tabPage指定父元素 tabPrjType.Enabled = true; break; case "城市桥梁工程": this.tabPage2.Text = "城市桥梁工程"; this.tabPage2.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "排水管道": this.tabPage3.Text = "排水管道"; this.tabPage3.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "供水管道": this.tabPage3.Text = "供水管道"; this.tabPage3.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "中水管道": this.tabPage3.Text = "中水管道"; this.tabPage3.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "燃气管道": this.tabPage3.Text = "燃气管道"; this.tabPage3.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "热力管道": this.tabPage3.Text = "热力管道"; this.tabPage3.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "污水处理厂": this.tabPage4.Text = "污水处理厂"; this.tabPage4.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "供水厂": this.tabPage4.Text = "供水厂"; this.tabPage4.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "给水泵站": this.tabPage4.Text = "给水泵站"; this.tabPage4.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "排水泵站": this.tabPage4.Text = "排水泵站"; this.tabPage4.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "垃圾处理工程": this.tabPage4.Text = "垃圾处理工程"; this.tabPage4.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "城市隧道工程": this.tabPage5.Text = "城市隧道工程"; this.tabPage5.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "公共交通工程": this.tabPage6.Text = "公共交通工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "轨道交通工程": this.tabPage6.Text = "轨道交通工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "环节卫生工程": this.tabPage6.Text = "环节卫生工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "照明工程": this.tabPage6.Text = "照明工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "绿化工程": this.tabPage6.Text = "绿化工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "电力工程": this.tabPage6.Text = "电力工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; case "通信工程": this.tabPage6.Text = "通信工程"; this.tabPage6.Parent = tabPrjType; tabPrjType.Enabled = true; break; } } 如果想循环遍历TabContorl下所有的TextBox控件并赋值为空可以这么写: foreach (TabPage page in tabControl1.TabPages) { foreach (Control control in page.Controls) { if (control is TextBox) { ((TextBox)control) = ""; } if (control is ComboBox) { ((ComboBox)control).SelectedIndex = -1; } } } 获取选中下拉的问本值: comboBox1.GetItemText(comboBox1.Items[comboBox1.SelectedIndex]); 实现效果如下:
Form1: 父窗体, Form2: 子窗体。 1.父窗体接收子窗体的返回值: public partial class Form1: Form { private void btnOpen_Click(object sender, EventArgs e) { FrmCorpDTAdd fd = new FrmCorpDTAdd(dsService); if (fd.ShowDialog() == DialogResult.Cancel) //打开子窗体,并且关闭后 { RetRowGuid = fd._RetRowGuid; //此处接收子窗体的值 } } } public partial class Form2 : Form { public string _RetRowGuid; //定义共有的全局变量方便其他窗体访问,记录返回到父窗体的值 private void btnSave_Click(object sender, EventArgs e) { _RetRowGuid = dgSG_AptitudeProject.CurrentRow.Cells["RowGuid"].Value.ToString(); //dataGridView选中行的RowGuid值赋给全局变量_RetRowGuid this.DialogResult = DialogResult.Cancel; //取消(关闭) } } 后期会加工修改。。。
1、jquery获取当前选中select的text值 $("#select1").find("option:selected").text(); 2、jquery获取当前选中select的value值 $("#select1").val(); 3、jquery获取当前选中select的索引值 $("#select1").get(0).selectedIndex; 4、jquery设置索引值为1的项为当前选中项 $("#select1").get(0).selectedIndex=1; 5、jquery设置value值1的项为当前选中项 $("#select1").val(1); 6、jquery设置text值为"2017"的项为当前选中项 $("#select1 option[text='2017']").attr("selected",true); 7、为指定select下拉框追加一个option(追加到在末尾) $("#select1").append(""+i+""); 8、为制定select下拉框插入一个option(插入到第一个位置) $("#select1").prepend("请选择"); 9、jquery删除select下拉框的最后一个option $("#select1 option:last").remove(); 10、清空select控件内容 $("#select1").empty(); 11、jQuery添加/删除Select的Option项 $("#select1").append("<option value='Value'>Text</option>"); //为Select追加一个Option(下拉项) $("#select1").prepend("<option value='0'>请选择</option>"); //为Select插入一个Option(第一个位置) $("#select1 option:last").remove(); //删除Select中索引值最大Option(最后一个) $("#select1 option[index='0']").remove(); //删除Select中索引值为0的Option(第一个) $("#select1 option[value='3']").remove(); //删除Select中Value='3'的Option $("#select1 option[text='4']").remove(); //删除Select中Text='4'的Option
本文主要实现无动态刷新查询后台数据功能,主要用到ajax+ashx+sqlserver进行交互. 首先需要引用Jquery: <script language="javascript" type="text/javascript" src="../js/jquery.js"> html脚本: <asp:TextBox ID="tb_corpName" runat="server" MaxLength="100" Width="369px"></asp:TextBox> 前台通过一个事件来调用ashx: <script type="text/javascript"> $(function () { $("#tb_corpName").blur(function () { //鼠标失去焦点事件 var corpName = $("#tb_corpName").val(); $.ajax({ type: "post", //提交方式 url: "/ashx/FZGpyShowData.ashx", //一般处理程序的路径 data: { corpName: corpName }, //向后台传入的值 dataType: "json", //返回值格式 success: function (data) { //返回成功后将要做的事,这里是返回一个表 $("#tb_CreditCode").val(data[0].CreditCode); $("#tb_corpCode").val(data[0].CorpCode); $("#tb_linkTel").val(data[0].LinkPhone); $("#corpProvince option[text='" + data[0].StateName + "']").attr("selected", true); showCity(); $("#corpCity option[text='" + data[0].AdminAreaName + "']").attr("selected", true); $("#tb_address").val(data[0].Address); $("#tb_linkMan").val(data[0].LinkMan); $("#tb_Mobile").val(data[0].LinkMobile); } }); }) }) </script> 后台来接收前台传过来的值,对其进行操作: public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; string corpName = context.Request["corpName"].Trim().ToString(); //接收前台传过来的参数 if (corpName != "") { string sql = @"select top 1 CorpName,CreditCode,CorpCode,LinkPhone,StateName,AdminAreaName,LinkMan,LinkMobile,Address from tbProductOrder as a inner join tbStateDic as b on a.StateNum = b.StateNum inner join tbAdminAreaClass on a.CityNum = AdminAreaClassID where CorpName =@CorpName order by CorpName"; SqlParameter[] par = new SqlParameter[1]; par[0] = new SqlParameter("@CorpName", corpName); DataSet ds = DBHerpler.Load(sql, par); string json = SerializerHelper.ToJsonString(ds.Tables[0]); //返回json类型的数据 context.Response.Write(json); context.Response.End(); } } SerializerHelper类的定义: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.IO; using System.Xml.Serialization; using Newtonsoft.Json; /// <summary> /// SerializerHelper 的摘要说明 /// </summary> public static class SerializerHelper { /// <summary> /// 反序列化XML文件 /// </summary> public static T LoadFromXmlFile<T>(string filepath) where T : class { using (FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); return (T)serializer.Deserialize(stream); } } /// <summary> /// 反序列化XML字符串 /// </summary> public static T LoadFromXmlString<T>(string xml) where T : class { XmlSerializer serializer = new XmlSerializer(typeof(T)); byte[] bytes = Encoding.UTF8.GetBytes(xml); using (MemoryStream stream = new MemoryStream(bytes)) { return (T)serializer.Deserialize(stream); } } /// <summary> /// 序列化XML对象 /// </summary> public static string SaveToXmlString<T>(T entity) where T : class { using (MemoryStream stream = new MemoryStream()) { XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(stream, entity); return Encoding.UTF8.GetString(stream.ToArray()); } } /// <summary> /// 序列化Json对象 /// </summary> public static string ToJsonString(object obj) { return ToJsonString<object>(obj); } /// <summary> /// 序列化Json对象 /// </summary> public static string ToJsonString<T>(T obj) where T : class { string text = JsonConvert.SerializeObject(obj); return text; } /// <summary> /// 反序列化Json字符串 /// </summary> public static T ToJsonObject<T>(string text) where T : class { T obj = (T)JsonConvert.DeserializeObject(text, typeof(T)); return obj; } } 如果向后台传入多个参数在data里面用逗号分割可写多个参数: data: { corpName: corpName , corpName2: corpName2}
本文章主要用于在网页上填写数据动态填入Word模板中使用 首先要准备一个Word模板,然后在需要插入数据的位置插入书签,这样可以确定在网页上填入的数据可以插入到Word文档相应的位置。 在项目中要声明 using Microsoft.Office.Interop.Word 类 后台代码: protected void btnPrint_Click(object sender, EventArgs e) { string path = Server.MapPath("~\\UploadFiles\\"); //解决方案下的文件夹 string templatePath = path + "VATInvoiceDocument.doc"; //模板 WordOp wop = new WordOp(); //实例化WordOp类 wop.OpenTempelte(templatePath); wop.FillLable("gongsimingcheng", conType); wop.FillLable("huming", this.txtAccountName.Value); wop.FillLable("shuihao", this.txtDutyPparagraph.Value); wop.FillLable("kaihuhang", this.txtBankAccount.Value); wop.FillLable("zhanghao", this.txtAccounts.Value); wop.FillLable("dizhi", this.txtAddress.Value); wop.FillLable("dianhua", this.txtTelephone.Value); wop.FillLable("kaipiaodaima", this.txtBilingCode.Value); wop.FillLable("shenqingrenyuan", this.txtApplicant.Value); wop.FillLable("lianxidianhua", this.txtContact.Value); wop.FillLable("nian", this.txtYearL.Value); wop.FillLable("yue", this.txtMonthL.Value); wop.FillLable("ri", this.txtDaysL.Value); wop.SaveAs(path + "VATInvoiceDocument1.doc", true); //将要保存到的Word文档 wop.Quit(); Response.Redirect(@"/UploadFiles/VATInvoiceDocument1.doc"); //做个跳转用于下载. } WordOp类的代码实现: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using Microsoft.Office.Interop.Word; using System.IO; namespace CCIR.CorpWebSite.WebPage { public class WordOp { public WordOp() { // // TODO: 在此处添加构造函数逻辑 // } private ApplicationClass WordApp; private Document WordDoc; private static bool isOpened = false;//判断word模版是否被占用 public void SaveAs(string strFileName, bool isReplace) { if (isReplace && File.Exists(strFileName)) { File.Delete(strFileName); } object missing = Type.Missing; object fileName = strFileName; WordDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); } //定义一个Word.Application 对象 public void activeWordApp() { WordApp = new ApplicationClass(); } public void Quit() { object missing = System.Reflection.Missing.Value; WordApp.Application.Quit(ref missing, ref missing, ref missing); isOpened = false; } //基于模版新建Word文件 public void OpenTempelte(string strTemppath) { object Missing = Type.Missing; //object Missing = System.Reflection.Missing.Value; activeWordApp(); WordApp.Visible = false; object oTemplate = (object)strTemppath; try { while (isOpened) { System.Threading.Thread.Sleep(500); } WordDoc = WordApp.Documents.Add(ref oTemplate, ref Missing, ref Missing, ref Missing); isOpened = true; WordDoc.Activate(); } catch (Exception Ex) { Quit(); isOpened = false; throw new Exception(Ex.Message); } } public void FillLable(string LabelId, string Content) { //打开Word模版 // OpenTempelte(tempName); //对LabelId的标签进行填充内容Content,即函件题目项 object bkmC = LabelId; if (WordApp.ActiveDocument.Bookmarks.Exists(LabelId) == true) { WordApp.ActiveDocument.Bookmarks.get_Item(ref bkmC).Select(); } WordApp.Selection.TypeText(Content); //SaveAs(saveAsFileName); //Quit(); } } } 本文用于以后操作时使用,如有不足指出望读者指出
一.上传扫描件到服务器,自定义创建文件夹(如果存在该文件夹,则无需创建),并判断格式以及文件大小进行保存: 首先创建一个保存按钮事件: protected void btnSave_Click(object sender, EventArgs e) { try {#region 增值税专用发票扫描件 验证 if (UploadFile1.PostedFile == null || UploadFile1.PostedFile.ContentLength <= 0) { tools.showMsg("请选择“增值税专用发票”扫描件信息!", true, null); this.UploadFile1.Focus(); return; } if (UploadFile1.PostedFile.ContentLength > 250 * 1024) { tools.showMsg("“增值税专用发票”扫描件大于250K,不能上传!", true, null); this.UploadFile1.Focus(); return; } #endregion #region 上传扫描件 string strErrMsg = ""; string conType = this.txtCorpName.Value; //获取将要存储的文件夹名称 bool bl = UploadFile(UploadFile1,conType, out strErrMsg); //tb_corpName.Text.Trim() if (!bl) { Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('“增值税专用发票”扫描件上传失败')</script>"); this.UploadFile1.Focus(); return; } #endregion } catch(Exception ex) { Page.ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('"+ex.Message+"')</script>"); } } 调用 UploadFile 方法: private bool UploadFile(HtmlInputFile inputfile,string conType, out string strErrMsg) //传入三个参数:file控件,文件夹名称,错误信息 { strErrMsg = ""; string strUploadFileName = ""; try { if (inputfile.PostedFile != null) { if (inputfile.PostedFile.ContentLength > 0) //判断是否选中文件 { string strUploadFolder = Server.MapPath("..\\UploadAffix\\" + conType.ToString()); //获取将要创建的文件夹名称 if (!Directory.Exists(strUploadFolder)) //判断是否已创建 (如果未创建,则进行创建) { Directory.CreateDirectory(strUploadFolder); } string strExtName = Path.GetExtension(inputfile.PostedFile.FileName); //判断上传文件的类型 if (strExtName.ToUpper() != ".JPG" && strExtName.ToUpper() != ".JPEG") { strErrMsg = "请选择扫描件文件(*.JPG,*.JPEG)!"; return false; } strUploadFileName = Server.MapPath(@"..\"); string strGUID = Guid.NewGuid().ToString("B"); //生成唯一的标识符 strUploadFileName += @"UploadAffix" + @"\" + conType + @"\" + strGUID; strUploadFileName += strExtName; inputfile.PostedFile.SaveAs(strUploadFileName); jpgStrPath = "/UploadAffix/" + conType + "/" + strGUID + strExtName; //获取保存在文件夹下的路径 return true; } else { strErrMsg = "请选择要上传的扫描件文件!"; return false; } } else { return false; } } catch (Exception ex) { strErrMsg = "上传扫描件文件出现问题:" + ex.Message; return false; } } 二.通过FileUploadButton按钮上传文件,实现将文件保存到服务器。 后台代码: protected void FileUploadButton_Click(object sender, EventArgs e) { bool fileOk = false; string fileName = this.MyFileUpload.FileName; //获取上传的文件名 int fileSize = MyFileUpload.PostedFile.ContentLength; //获取上传文件大小(25600) string path = Server.MapPath("~\\UploadFiles\\"); //指定文件路径,是项目下的一个文件夹;~表示当前网页所在的文件夹 if (MyFileUpload.HasFile) //判断是否选中文件 { string fileExtension = System.IO.Path.GetExtension(MyFileUpload.FileName).ToLower(); //得到文件后缀 string[] allowedExtensions = { ".jpg", ".jpeg" }; //允许的得到的后缀 for (int i = 0; i < allowedExtensions.Length; i++) //看包含的文件是否是被允许的文件的后缀 { if (fileExtension == allowedExtensions[i]) { fileOk = true; } } if (!fileOk) //判断格式是否为jpg或jpeg { Response.Write("<script>alert('只能上传jpeg,jpg图象文件!');</script>"); } if (fileSize > 256000) //如果文件大于250K 则提示不能上传 { Response.Write("<script>alert('文件最大为250KB!');</script>"); return; } if (fileOk) { try { string newName = fileName+DateTime.Now.ToString("yyyyMMddhhmmss");//新文件名 MyFileUpload.PostedFile.SaveAs(path + newName); //文件另存在服务器的指定目录下 Response.Write("<script>alert('文件上传成功!');</script>"); } catch(Exception ee) { Response.Write("<script>alert('"+ee.Message+"');</script>"); } } } else { Response.Write("<script>alert('请选择将要上传的文件!');</script>"); } } 前台代码: <asp:FileUpload ID="MyFileUpload" runat="server" style="width:303px;" /> <asp:Button ID="FileUploadButton" runat="server" Text="上传" OnClick="FileUploadButton_Click" />
验证码的作用: 1.有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能。 2.防止批量注册首先要准备jquery、jquery.idcode.css 和 jquery.idcode.js 三个脚本,然后再html文档中进行实例生成。 jquery.idcode.css 样式: 1 @charset "utf-8"; 2 /* track base Css */ 3 4 .ehong-idcode-val{ 5 position:relative; 6 padding:1px 4px 1px 4px; 7 top:0px; 8 *top:-3px; 9 letter-spacing:4px; 10 display:inline; 11 cursor:pointer; 12 font-size:20px; 13 font-family:"Courier New", Courier, monospace; 14 text-decoration:none; 15 font-weight:bold; 16 } 17 .ehong-idcode-val0{ 18 border:solid 1px #A4CDED; 19 background-color:#ECFAFB; 20 } 21 22 .ehong-idcode-val1{ 23 border:solid 1px #A4CDED; 24 background-color:#FCEFCF; 25 } 26 .ehong-idcode-val2{ 27 border:solid 1px #6C9; 28 background-color:#D0F0DF; 29 } 30 .ehong-idcode-val3{ 31 border:solid 1px #6C9; 32 background-color:#DCDDD8; 33 } 34 .ehong-idcode-val4{ 35 border:solid 1px #6C9; 36 background-color:#F1DEFF; 37 } 38 .ehong-idcode-val5{ 39 border:solid 1px #6C9; 40 background-color:#ACE1F1; 41 } 42 .ehong-code-val-tip{ 43 font-size:12px; 44 color:#1098EC; 45 top:0px; 46 *top:-3px; 47 position:relative; 48 margin:0px 0px 0px 4px; 49 cursor:pointer; 50 } jquery.idcode.css jquery.idcode.js 脚本: 1 (function($){ 2 var settings = { 3 e : 'idcode', 4 codeType : { name : 'follow', len: 4}, 5 codeTip : 'refresh?', 6 inputID : 'Txtidcode' //引用验证码输入框Id 7 }; 8 9 var _set = { 10 storeLable : 'codeval', 11 store : '#ehong-code-input', 12 codeval : '#ehong-code' 13 } 14 $.idcode = { 15 getCode:function(option){ 16 _commSetting(option); 17 return _storeData(_set.storeLable, null); 18 }, 19 setCode:function(option){ 20 _commSetting(option); 21 _setCodeStyle("#"+settings.e, settings.codeType.name, settings.codeType.len); 22 23 }, 24 validateCode:function(option){ 25 _commSetting(option); 26 var inputV; 27 if(settings.inputID){ 28 inputV=$('#' + settings.inputID).val(); 29 }else{ 30 inputV=$(_set.store).val(); 31 } 32 33 if(inputV == _storeData(_set.storeLable, null)){ 34 return true; 35 }else{ 36 _setCodeStyle("#"+settings.e, settings.codeType.name, settings.codeType.len); 37 return false; 38 } 39 } 40 }; 41 42 function _commSetting(option){ 43 $.extend(settings, option); 44 } 45 46 function _storeData(dataLabel, data){ 47 var store = $(_set.codeval).get(0); 48 if(data){ 49 $.data(store, dataLabel, data); 50 }else{ 51 return $.data(store, dataLabel); 52 } 53 } 54 55 function _setCodeStyle(eid, codeType, codeLength){ 56 var codeObj = _createCode(settings.codeType.name, settings.codeType.len); 57 var randNum = Math.floor(Math.random()*6); 58 var htmlCode='' 59 if(!settings.inputID){ 60 htmlCode='<span><input id="ehong-code-input" type="text" maxlength="4" /></span>'; 61 } 62 htmlCode+='<div id="ehong-code" class="ehong-idcode-val ehong-idcode-val'; 63 htmlCode+=String(randNum); 64 htmlCode+='" href="#" onblur="return false" onfocus="return false" oncontextmenu="return false" onclick="$.idcode.setCode()">' + _setStyle(codeObj) + '</div>' + '<span id="ehong-code-tip-ck" class="ehong-code-val-tip" onclick="$.idcode.setCode()">'/*+ settings.codeTip*/ +'</span>'; 65 $(eid).html(htmlCode); 66 _storeData(_set.storeLable, codeObj); 67 } 68 69 function _setStyle(codeObj){ 70 var fnCodeObj = new Array(); 71 var col = new Array('#BF0C43', '#E69A2A','#707F02','#18975F','#BC3087','#73C841','#780320','#90719B','#1F72D8','#D6A03C','#6B486E','#243F5F','#16BDB5'); 72 var charIndex; 73 for(var i=0;i<codeObj.length;i++){ 74 charIndex = Math.floor(Math.random()*col.length); 75 fnCodeObj.push('<font color="' + col[charIndex] + '">' + codeObj.charAt(i) + '</font>'); 76 } 77 return fnCodeObj.join(''); 78 } 79 function _createCode(codeType, codeLength){ 80 var codeObj; 81 if(codeType=='follow'){ 82 codeObj = _createCodeFollow(codeLength); 83 }else if(codeType=='calc'){ 84 codeObj = _createCodeCalc(codeLength); 85 }else{ 86 codeObj=""; 87 } 88 return codeObj; 89 } 90 91 function _createCodeCalc(codeLength){ 92 var code1, code2, codeResult; 93 var selectChar = new Array('0','1','2','3','4','5','6','7','8','9'); 94 var charIndex; 95 for(var i=0;i<codeLength;i++){ 96 charIndex = Math.floor(Math.random()*selectChar.length); 97 code1 +=selectChar[charIndex]; 98 99 charIndex = Math.floor(Math.random()*selectChar.length); 100 code2 +=selectChar[charIndex]; 101 } 102 return [parseInt(code1), parseInt(code2) , parseInt(code1) + parseInt(code2)] ; 103 } 104 105 function _createCodeFollow(codeLength){ 106 var code = ""; 107 var selectChar = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'); 108 109 for(var i=0;i<codeLength;i++){ 110 var charIndex = Math.floor(Math.random()*selectChar.length); 111 if(charIndex % 2 == 0){ 112 code+=selectChar[charIndex].toLowerCase(); 113 }else{ 114 code +=selectChar[charIndex]; 115 } 116 } 117 return code; 118 } 119 120 })(jQuery); jquery.idcode.js jquery 的脚本从官网上下载即可。html代码部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery区分大小写验证码</title> <!--//引用css--> <link href="css/jquery.idcode.css" type="text/css" rel="stylesheet"> </head> <body> <center><br><br> <input type="text" id ="Txtidcode" class ="txtVerification"><span id="idcode"></span> <input type="button" id="butn" value="提交"></center> <script src="js/jquery-1.12.3.min.js"></script> <!--//引用idcode插件--> <script src="js/jquery.idcode.js"></script> <script> $.idcode.setCode(); //加载生成验证码方法 $("#butn").click(function(){ var IsBy = $.idcode.validateCode() //调用返回值,返回值结果为true或者false if(IsBy){ alert("验证码输入正确") }else { alert("请重新输入") } }) </script> </body> </html>