这两天忙着给越南那边的程序翻译,一个头变成两个了,自己的英语水平只能用三脚猫来形容,再加上对制版的专业用语不熟,金山词霸,goolge翻译,CSND英语栏目,全部多线程开着,哈哈,听几门牌了。下午接到短信开发新任务,用的是深圳商悦GSM猫,五百来块,也不算贵,相当于一部低档手机,再通过串口和PC连接,我需要做的就是做个接口给程序调用,可以发短信和接收短信,然后作处理记录保存在数据库里,也谈不上有难度,不就是接和发,哈哈,信心十足地跟老大把任务接了下来。自己知道这些硬件商都有提供demo和文档给开发者,大概看一下就明白。打开光盘发现没有c#的demo,只有vb.net的,没计啦,再装个VB.NET,打开vb.net的demo,唉,对VB.NET代码不敢恭维啊,密密麻麻地涂在一起,还好,自己不是学vb.net的,不然会没有学下去的欲望。没办法,还得硬着头皮看一下代码,知道了主要是Axalasun.Axalasunsms这个类。整个步骤如下:一、注册两个COMregsvr32.exe c:\winnt\system32\alasunsmscon.ocxregsvr32.exe c:\winnt\system32\mscomm32.ocx二、在工具箱上添加选项在com组件选项卡里选中Alasun SMS Control三、把这个控件拖到窗体中窗体代码自动生了private Axalasun.Axalasunsms axalasunsms1 = new Axalasun.Axalasunsms();//这个是主角,刚开始不知道,花了一个来小时寻找它四、开始对这个实例对象操作了axalasunsms1.OpenComm();//打开GSM猫axalasunsms1.ReadMsgByIndex(..);//读信息axalasunsms1.SendMsg(...);//发送信息axalasunsms1.CloseComm();//关闭猫猫总结:1、开始直接在项目里引用COM,以为在代码可以自动找到主角类,搞了半天也找不到,后来把它放在工具箱再拖到窗体中才可以。2、发送信息时,不懂手机中心号码是什么,信息提示发出去了,但是收不到,以为手机卡没钱了,反复拔插了几次,最终是中心号码设置错了。3、当手机收到信息时,不能触发OnReceive事件,这个得问一下别人,如果不行的话,只能靠线程定时读取猫了,这样会消耗点性能。4、总体来说还不错,一个下午搞懂一个小知识点,以后大有所用。待续...
用c#做winForm,一个字“很慢”,大都数人都在叫BILL骂dotNet框架,我没骂,但埋怨过,有网友说过,MS是大哥,大哥没有错,
有错也是我们的错。其实主要还是我们的开发功夫没到家,UI界面处理上没有把握好,很多时候打开窗体出现假死机现象,间接影响
了中国的国民收入,原因就不说了,也说不完的。这篇文章的出生,主要因昨晚偶和BackgroundWorker组件的懈逅,在webcast上知道有这个组件,经过数分钟的众里寻它千百度,没
错,我用的是百度,终于把它一层层华丽的衣裳剥去,只剩下DoWork和RunWorkerCompleted两个中心(事件),
WorkerSupportCancellation 一个基本点(属性)
让我们开始用艺术的眼光欣赏了
第一步:把它请到我们的窗体上第二步:轻轻点击它的两个中心,生成两个事件方法第三步:设置WorkerSupportCancellation为true,不true就不是重点了啊。
老毛说过,没有实践就没有发言权,接下来是时候动手了,用代码说话吧!
程序员的工资少,所以代码也不想写多,搞了几行就把导出Excel功能实现了!-_-#这个也可以重写一下,换成控件导出Excel,只要取出DataSource就行了,原理一样!
今天下午花了两个小时写的,感觉很不错! /// <summary> /// TreeView checked事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tvMenu_AfterCheck(object sender, TreeViewEventArgs e) { CheckAll(e.Node); }
/// <summary> /// 全部节点check处理 /// </summary> /// <param name="eTreeNode"></param> private void CheckAll(TreeNode eTreeNode) { tvMenu.AfterCheck -=new TreeViewEventHandler(tvMenu_AfterCheck); if (eTreeNode.Parent != null) { CheckParent(eTreeNode); } if (eTreeNode.Nodes.Count > 0) { foreach (TreeNode mTN in eTreeNode.Nodes) { mTN.Checked = eTreeNode.Checked; foreach (TreeNode mTNSub in mTN.Nodes) { mTNSub.Checked = mTN.Checked; CheckSub(mTNSub); } } } tvMenu.AfterCheck += new TreeViewEventHandler(tvMenu_AfterCheck); } /// <summary> /// 父节点处理 /// </summary> /// <param name="eTreeNode"></param> private void CheckParent(TreeNode eTreeNode) { if (eTreeNode.Parent == null) { return; } eTreeNode.Parent.Checked = eTreeNode.Checked; foreach (TreeNode mTN in eTreeNode.Parent.Nodes) { eTreeNode.Parent.Checked = (eTreeNode.Parent.Checked || mTN.Checked); if (mTN.Parent != null) { CheckParent(mTN.Parent); } } } /// <summary> /// 子节点处理 /// </summary> /// <param name="eTreeNode"></param> private void CheckSub(TreeNode eTreeNode) { foreach (TreeNode mTN in eTreeNode.Nodes) { mTN.Checked = eTreeNode.Checked; CheckSub(mTN); } }