AppleSeeker's Tech Blog
Welcome to AppleSeeker's space
posts - 50,  comments - 504,  trackbacks - 2
这篇文章主要讲述:Microsoft.WindowsMobile.PocketOutlook命名空间下的五个类:
1.OutlookSession
2.AppointmentCollection, Appointment
3.ContactCollection, Contact
4.SmsMessage
5.EmailMessage

该命名空间主要针对PocketOutlook中的所提供的Appointment(约会), Task(计划), Contact(联系人), 短信, 邮件的操作。
注:在WM5.0系统中已提供该命名空间,即CF2.0下也提供支持。

下面就开始逐个介绍。首先运行下程序效果。


OutlookSession是取得PocketOutlook中的所有信息的一个对象, 该对象提供访问PocketOutlook对象模型的一个入口。通过该对象, 可以操作PocketOutlook所提供的所有操作。

当点击Appointments时, 取得已存在的Appoint, 并添加一个新的Appoint.
通过OutlookSession.Appointments.Item得到AppointmentCollection(所有集合). 该集合内存放所有Appointment.
这些Appointment按照时间的顺序排列. 当然, 你也可以指定按什么排序. 使用Sort方法, 并指定排序字段即可.
AppointmentCollectionAddNew方法:在集合对象中创建一个新Appointment, 并将该对象返回, 类似于DataRow.
返回新对象后, 对该对象的属性进行赋值后, 通过该对象的Update方法, 就能自动更新集合内信息.

代码如下:
 1            OutlookSession session = new OutlookSession();
 2

 3            foreach (Appointment app in
 session.Appointments.Items)
 4            
{
 5                this.listBox1.Items.Add("ItemId: " +
 app.ItemId);
 6                this.listBox1.Items.Add("Subject: " +
 app.Subject);
 7                this.listBox1.Items.Add("AllDayEvent: " +
 app.AllDayEvent.ToString());
 8                this.listBox1.Items.Add("Body: " +
 app.Body);
 9                this.listBox1.Items.Add("BusyStatus: " +
 app.BusyStatus.ToString());
10                this.listBox1.Items.Add("Location: " +
 app.Location);
11                this.listBox1.Items.Add(""
);
12            }

13
14            Appointment appAdd =
 session.Appointments.Items.AddNew();
15            appAdd.Subject = "Add Now"
;
16            appAdd.Location = "Shanghai"
;
17            appAdd.Start = System.DateTime.Now.AddHours(1
);
18            appAdd.End = System.DateTime.Now.AddHours(2
);
19            appAdd.BusyStatus =
 BusyStatus.Busy;
20            appAdd.Update();

效果如下:

Appoint没有添加时的效果.

Appointment与AppointmentCollection也有很多事件, 这里举一个AppointmentCollectionListChanged事件.
AppointmentCollection集合中的任一Appoint发生变化(新增, 修改, 删除)时, 该事件即会被触发.
代码如下:
 1        void Items_ListChanged(object sender, ListChangedEventArgs e)
 2        
{
 3            //this.listBox1.Items.Add("Type Name: " + sender.GetType().FullName);

 4            AppointmentCollection appCol = (AppointmentCollection)sender;
 5            if (e.ListChangedType ==
 ListChangedType.ItemChanged)
 6            
{
 7                this.listBox1.Items.Add("ItemId: " +
 appCol[e.NewIndex].ItemId);
 8                this.listBox1.Items.Add("Subject: " +
 appCol[e.NewIndex].Subject);
 9                this.listBox1.Items.Add("AllDayEvent: " +
 appCol[e.NewIndex].AllDayEvent.ToString());
10                this.listBox1.Items.Add("Body: " +
 appCol[e.NewIndex].Body);
11                this.listBox1.Items.Add("BusyStatus: " +
 appCol[e.NewIndex].BusyStatus.ToString());
12                this.listBox1.Items.Add("Location: " +
 appCol[e.NewIndex].Location);
13                this.listBox1.Items.Add(""
);
14            }

15        }

效果如下:

Subject为Add Now为添加的Appoint.

Contact对象, 通过OutlookSessionContacts.Items得到ContactCollection.
访问方法与Appoint一致.在此, 只演示代码.
 1        private void menuItem7_Click(object sender, EventArgs e)
 2        
{
 3            OutlookSession session = new
 OutlookSession();
 4

 5            foreach (Contact contact in
 session.Contacts.Items)
 6            
{
 7                this.listBox1.Items.Add("File As: " +
 contact.FileAs);
 8                this.listBox1.Items.Add("Email1Address: " +
 contact.Email1Address);
 9                this.listBox1.Items.Add(""
);
10            }

11
12            Contact contactAdd =
 session.Contacts.Items.AddNew();
13            contactAdd.FileAs = "Test Man"
;
14            contactAdd.FirstName = "Test"
;
15            contactAdd.LastName = "Man"
;
16            contactAdd.Email1Address = "Test@abs.com"
;
17
            contactAdd.Update();
18        }

效果如下:


Task, TaskCollection:看过上述的Appoint与Contact后, 相信大家也一定能够使用Task的. 使用方式完全一致.
Appoint, Contact, Task. 在OutlookSession中唯一标识符为ItemId. 可以在集合中通过ItemId来取得你需要的某一个内容.
并且它们可以创建除ItemId以外, 内容完全一致的对象, 这是完全存在的.



SmsMessage:短信对象.可以在构造函数时传入要发送的号码及内容, 也可以在创建完对象后对其属性进行修改.
该对象提供Send方法, 用于发送短信. 当然, 也可以通过OutlookSession的SmsAccount.Send方法发送, 这都是一样的.
注:短信不支持彩信功能, 只能发送文字信息. 当程序自己发送消息完后, 发送的消息并不会出现在短信的已发送栏里.这和邮件发送不一致的地方, 需了解. 另外, 微软的IDE(VS2008)中存在一个BUG, 就是访问SmsMessage对象的Body时, 显示提示居然说是只读的, 但其实是读写都可以的.

应该改为Gets Or Sets the SMS message's text body.
代码如下:
 1        private void menuItem4_Click(object sender, EventArgs e)
 2        
{
 3            SmsMessage smsMessage = new
 SmsMessage(strContract, strMessage);
 4            smsMessage.RequestDeliveryReport = false
;
 5            //smsMessage.Send();

 6
 7            OutlookSession session = new OutlookSession();
 8            this.listBox1.Items.Add("SmsAccount Name: " +
 session.SmsAccount.Name);
 9            //this.listBox1.Items.Add("ItemID: " + smsMessage.ItemId.ToString());

10            session.SmsAccount.Send(smsMessage);
11

12            SmsMessage sms = new
 SmsMessage();
13            sms.Body = "Test"
;
14            sms.To.Add(new
 Recipient(strContract));
15
            session.SmsAccount.Send(sms);
16        }
通过Call Emulator工具,取得短信.


EmailMessage:发送邮件对象.
如果没有设置好EmailAccounts, 是无法正常发送Email的.
代码如下:
 1        private void menuItem5_Click(object sender, EventArgs e)
 2        
{
 3            EmailMessage mail = new
 EmailMessage();
 4            mail.To.Add(new Recipient("appleseeker@gmail.com"
));
 5            mail.Importance =
 Importance.High;
 6            mail.Subject = "It is test mail"
;
 7            mail.BodyText = "It is test mail"
;
 8            mail.Attachments.Add(new Attachment(@"\flower.jpg"
));
 9

10            OutlookSession session = new
 OutlookSession();
11            if (session.EmailAccounts.Count > 0
)
12                mail.Send(session.EmailAccounts[1
]);
13        }
OutlookSession.EmailAccount中, 我访问集合中第2个元素的理由:
因为当前是模拟器开发,所有该EmailAccounts中第1个元素是模拟器.只有后面的才是在模拟器上说设置的Mail帐户.
效果如下:

没有发送邮件时.

EmailMessage对象调用Send后,邮箱的邮件情况.

本文就PocketOutlook中的一些基本操作内容讲述完毕,改天会对如何操作PocketOutlook.MessageInterception命名空间作一下讲述,该空间提供消息拦截,起到过滤效果.

代码下载:SmartDeviceOutlookDemo_2008_03_24.rar

Author:Appleseeker
Date:2008-03-24
Tag标签: Windows Mobile
posted on 2008-03-24 23:26 AppleSeeker 阅读(2261) 评论(7)  编辑 收藏 所属分类: .NetMobile

FeedBack:
2008-03-25 02:16 | nicsdf [未注册用户]
您在 .Net 2.0 开发吗?


一个新的开发模式,基于 c# 2.0 + MSSQL 2005



为什么使用 NicPetShop ?

1、在使用多层开发,是否存在 inner join 查询的痛苦?

2、在使用 orM 开发,是否觉得系统很臃肿,调用方法也不尽人意(简单)?

3、您是否经常为了分页而不断从旧的代码中 COPY 几十行代码,也保证不了分页的易用通用?

4、您的开发模式使用起来简单吗?



NicPetShop 可以解决

1、采用多层开发架构

2、采用 c# 强类型与数据库表映射,并且引入 .net 2.0 的 System.Nullable<T> 支持可空类型

3、能将数据库的关系映射到 c#,让您使用更方便,让你不再为 inner join 查询烦恼

类似 <%# Eval("userGroupInfo.GroupName") %> 这样的绑定方式
List<UserInfo> User.GetItemsByUser_group_id(int user_group_id); 这样的快速方法生成

4、高效绑定分页,支持 repeater,datalist,gridview,并且支持设计时(傻瓜式)分页,也可将分页写入代码中,2行以内代码就可以为你制造高性能的多种分页方案

dataListPager1.DataSouce = User.GetItemsByUser_group_id(user_group_id, dataListPager1.Pager);
dataListPager1.DataBind();

5、语法简洁,功能强大

A、添加数据后即刻返回当前插入的对象(对应数据库表中新插入的行)
UserInfo user = User.Insert(null, "nic", "******");
//UserInfo user = new UserInfo();
//user.UserName = "nic";
//user.PassWord = "******";
//user = User.Insert(user);

B、按数据库建立的关系直接访问到主表对象
UserInfo user = User.GetItem(1);
User_groupInfo user_group = user.user_groupInfo;

C、在页面上绑定项时很轻易的在关系间访问,特别对于无限级类别表的使用(parent_id -> self.id 关系)
<ItemTemplate>
<%# Eval("Id") %>
<%# Eval("UserName") %>
<%# Eval("user_groupInfo.GroupName") %>
</ItemTemplate>

D、很轻易的得到对应 ID 的所有或自定义获取多少条集合
List<UserInfo> users = User.GetItemsByUser_group_id(user_group_id); //所有
List<UserInfo> users = User.GetItemsByUser_group_id(10, user_group_id); //前 10 条
List<UserInfo> users = User.GetItemsByUser_group_id(new Limit(10, 20), user_group_id); //第 10 到 20 条

E、按主键或惟一索引生成相应的方法
int rows = User.Delete(id);
int rows = User.DeleteByUserName(userName);

UserInfo user = User.GetItem(id);
UserInfo user = User.GetItemByUserName(userName);

F、很轻易的得到所有或自定义获取多少条集合
List<UserInfo> users = User.GetItems(); //所有
List<UserInfo> users = User.GetItems(10); //前 10 条
List<UserInfo> users = User.GetItems(new Limit(10, 20)); //第 10 到 20 条

H、ConnectionManager 安全管理 SqlConnection,对多线程安全使用
SqlConnection conn = ConnectionManager.GetConnection();

I、自动生成 RepeaterPager.cs,DataListPager.cs,GridViewPager.cs,它们分别继承于 System.Web.UI.WebControl.Repeater,System.Web.UI.WebControl.DataList,System.Web.UI.WebControl.GridView,支持设计时

J、将自己的 web 开发经验常用开发代码集中到生成的解决方案中
web.config,web.sitemap 的配置
App_Code\BasePage.cs 的建立,自动添加 Title,meta-keywords,meta-content,siteMapPath操作
connection.aspx 查看当前 web 程序使用的 sqlconnection 情况

6、将永久免费给大家使用






下载地址:NicPetShop.rar
     http://www.ku1001.com/images/NicPetShop.rar
     含两个项目说明

为了方便程序更新,本版本为 .net remoting 版本
请确保您的 sql server 2005 能被外网访问得到,不支持生成本地的数据库。

小提示:如果您是局域名,但又想生成,可以试试安装“花生壳”。






  回复  引用    
2008-03-25 13:49 | 毁于随      
楼上做广告,不太厚道.感觉像楼上这些东西还是自己用就好了,不要宣传了.
  回复  引用  查看    
2008-03-26 09:50 | fox23      
支持~ 几天没来,apple兄在潜心创作啊,呵呵:)
  回复  引用  查看    
#4楼 [楼主]
2008-03-26 16:32 | appleseeker      
@fox23
恩,潜心修炼秘籍,本来今天能再写篇,没想到。哎。。。。还差一口气。
  回复  引用  查看    
2008-04-05 13:42 | 如影如风      
cf不是不支持发短信的功能吗?
  回复  引用  查看    
2008-04-05 14:23 | 如影如风      
楼主能否请教一个问题。

MessagingApplication这个类有什么作用啊?
  回复  引用  查看    
#7楼 [楼主]
2008-04-06 10:40 | appleseeker      
@如影如风
cf1.0不支持,从cf2.0后,提供发送短信及邮件的托管API

MessagingApplication类,可以在SMS/邮件帐户之间切换,可以同步这些帐号(从Exchange服务器上)。
  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:
 
AppleSeeker

MSN:appleseeker@hotmail.com
Mail:appleseeker@gmail.com MVP

精品女装淘宝店


<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

与我联系

搜索

 

常用链接

留言簿(8)

我参与的团队

我的标签

随笔分类(78)

随笔档案(50)

Mobile Blog

最新随笔

积分与排名

  • 积分 - 116852
  • 排名 - 346

最新评论

阅读排行榜

评论排行榜

60天内阅读排行