Silverlight 2 (beta1)数据操作(2)——使用ASP.NET Web Service进行数据CRUD操作(下)

Silverlight 2 (beta1)数据操作(2)——使用ASP.NET Web Service进行数据CRUD操作(下)

上一篇中,我们把这个实例的基本部分完成了,也完成了Web Service关于调用数据库CRUD四个方法。这篇我们利用Silverlight 2完成这几个功能,由于本篇目的明确,分为四个操作,每个操作分别建立前台界面和后台代码实现,最后整合为一个整体。

上一篇:Silverlight 2 (beta1)数据操作(1)——使用ASP.NET Web Service进行数据CRUD操作(上)

本篇包含以下内容:

  • 添加数据部分
  • 查询数据部分
  • 修改数据部分
  • 删除数据部分
  • 整合程序
  • 结语

我们把各个部分分别用用户控件实现,然后在Page.xaml中一起整合起来。

添加数据部分

前台界面

添加数据界面

后台代码

//按钮事件
void saveButton_Click(object sender, RoutedEventArgs e)
{
    if (userName.Text.Trim() == string.Empty)
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = "请输入用户名称!";
        errMessage.Visibility = Visibility.Visible;
        return;
    }
    //调用WebService
    WebServiceProxy.UserManageSoapClient userMgrSoapClient =
        new YJingLee.WebSrv.WebServiceProxy.UserManageSoapClient();
    //创建用户操作
    userMgrSoapClient.CreateUserAsync(userName.Text);
    userMgrSoapClient.CreateUserCompleted += 
        new EventHandler<YJingLee.WebSrv.WebServiceProxy.
            CreateUserCompletedEventArgs>
            (userMgrSoapClient_CreateUserCompleted);
}
void userMgrSoapClient_CreateUserCompleted(object sender, 
    YJingLee.WebSrv.WebServiceProxy.CreateUserCompletedEventArgs e)
{
    if (e.Error == null)
    {
        errMessage.Text = "创建用户成功!";
        errMessage.Foreground = new SolidColorBrush(Colors.Blue);
        errMessage.Visibility = Visibility.Visible;
    }
    else
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = e.Error.ToString();
        errMessage.Visibility = Visibility.Visible;
    }
}

查询数据部分

前台界面

我们使用Silverlight 2自带的DataGrid控件绑定数据。前台非常简单,只是一个DataGrid控件,但是前段时间有的同学问DataGrid控件不知怎么弄进来。这里详细说明一下。

第一步:在Silverlight工程中添加引用

添加引用

第二步:查找System.Windows.Controls.Data程序集,添加进来

查找System.Windows.Controls.Data程序集

第三步:在UserControl中添加这个引用,有智能感知。我将其命名为Data。

智能感知

在前台编写代码如下

<Button x:Name="reButton" Content="刷新"
        Width="50" Height="30" Grid.Row="0"></Button>
<Data:DataGrid x:Name="userDataGrid" Height="200" 
               Width="700" Margin="0,5,0,10"
              AutoGenerateColumns="True" 
               VerticalAlignment="Top" Grid.Row="1">
</Data:DataGrid>

后台代码

//显示数据
void ListingControlDisplay(object sender, RoutedEventArgs e)
{
    WebServiceProxy.UserManageSoapClient userMgrSoapClient =
        new YJingLee.WebSrv.WebServiceProxy.UserManageSoapClient();
    userMgrSoapClient.RetrieveUsersAsync();
    userMgrSoapClient.RetrieveUsersCompleted +=
        new EventHandler<YJingLee.WebSrv.WebServiceProxy.
            RetrieveUsersCompletedEventArgs>
               (userMgrSoapClient_RetrieveUsersCompleted);
}
void userMgrSoapClient_RetrieveUsersCompleted(object sender, 
 YJingLee.WebSrv.WebServiceProxy.RetrieveUsersCompletedEventArgs e)
{
    if (e.Error == null)
        displayData(e.Result);
}
private void displayData(string xmlContent)
{
    try
    {
        if (xmlContent != string.Empty)
        {
            XDocument xmlUsers = XDocument.Parse(xmlContent);
            var users = from user in xmlUsers.Descendants("User")
                        select new
                        {
                            UserID = Convert.ToInt32
                                      (user.Element("UserID").Value),
                            UserName = (string)
                                      user.Element("UserName").Value
                        };
            List<User> usersList = new List<User>();
            foreach (var u in users)
            {
                User use = new User
                         { UserID = u.UserID, UserName = u.UserName };
                usersList.Add(use);
            }
            userDataGrid.ItemsSource = usersList;
        }
        else
        {
            userDataGrid.ItemsSource = null;
        }
    }
    catch (Exception ex)
    {

        Console.Write(ex.Message);
    }
}
public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
}

修改数据部分

前台界面

修改数据界面

后台代码

void updateButton_Click(object sender, RoutedEventArgs e)
{
    if (userID.Text.Trim() == string.Empty)
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = "请输入用户ID!";
        errMessage.Visibility = Visibility.Visible;
        return;
    }
    if (userName.Text.Trim() == string.Empty)
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = "请输入用户名称!";
        errMessage.Visibility = Visibility.Visible;
        return;
    }
    WebServiceProxy.UserManageSoapClient userMgrSoapClient =
        new YJingLee.WebSrv.WebServiceProxy.UserManageSoapClient();
    //调用更新用户方法
    userMgrSoapClient.UpdateUserAsync
          (Int16.Parse(userID.Text.Trim()), userName.Text.Trim());
    userMgrSoapClient.UpdateUserCompleted +=
        new EventHandler<YJingLee.WebSrv.WebServiceProxy.
            UpdateUserCompletedEventArgs>
                   (userMgrSoapClient_UpdateUserCompleted);
}
void userMgrSoapClient_UpdateUserCompleted(object sender,
    YJingLee.WebSrv.WebServiceProxy.UpdateUserCompletedEventArgs e)
{
    if (e.Error == null)
    {
        errMessage.Text = "修改用户成功!";
        errMessage.Foreground = new SolidColorBrush(Colors.Blue);
        errMessage.Visibility = Visibility.Visible;
    }
    else
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = e.Error.ToString();
        errMessage.Visibility = Visibility.Visible;
    }
}

删除数据部分

前台界面

删除数据界面

后台代码

void deleteButton_Click(object sender, RoutedEventArgs e)
{
    if (userID.Text.Trim() == string.Empty)
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = "请输入用户ID!";
        errMessage.Visibility = Visibility.Visible;
        return;
    }
    WebServiceProxy.UserManageSoapClient userMgrSoapClient =
        new YJingLee.WebSrv.WebServiceProxy.UserManageSoapClient();
    //调用删除方法
    userMgrSoapClient.DeleteUserAsync
          (Int16.Parse(userID.Text.Trim()));
    userMgrSoapClient.DeleteUserCompleted+=
        new EventHandler<YJingLee.WebSrv.WebServiceProxy.
            DeleteUserCompletedEventArgs>
                  (userMgrSoapClient_DeleteUserCompleted);
}

void userMgrSoapClient_DeleteUserCompleted(object sender,
    YJingLee.WebSrv.WebServiceProxy.DeleteUserCompletedEventArgs e)
{
    if (e.Error == null)
    {
        errMessage.Text = "删除用户成功!";
        errMessage.Foreground = new SolidColorBrush(Colors.Blue);
        errMessage.Visibility = Visibility.Visible;
    }
    else
    {
        errMessage.Foreground = new SolidColorBrush(Colors.Red);
        errMessage.Text = e.Error.ToString();
        errMessage.Visibility = Visibility.Visible;
    }
}

整合程序

在Page.xaml页面中布局,并引入用户控件,添加4个HyperlinkButton ,单击事件用户控件在中间区域显示。例如下面一个按钮事件:

deleteCtl.Visibility = Visibility.Visible;
entryCtl.Visibility = Visibility.Collapsed;
listingCtl.Visibility = Visibility.Collapsed;
editCtl.Visibility = Visibility.Collapsed;

最终效果图如下所示:

整体实例界面

结语

利用这个实例我们学习了在Silverlight 2中使用ASP.NET Web Service进行数据CRUD操作,这里有一些细节没有完善,比如输入框的验证问题等。下一篇我们利用ADO.NET Data Service来操作数据。

例子下载(4月11日补充)

YJingLee.WebSrv.rar


作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com
转载请注明此处,谢谢!

Tag标签: Silverlight
posted @ 2008-04-09 22:39 李永京 阅读(3613) 评论(37)  编辑 收藏 所属分类: Silverlight

  回复  引用  查看    
#1楼 2008-04-10 08:23 | 李战      
飞过,学习。
  回复  引用    
#2楼 2008-04-10 08:48 | 彩云飞 [未注册用户]
操作数据不是难事,但对于如何保证安全还没有看过实例代码。
博主能不能结合webservice安全性讲一下这个例子?

  回复  引用  查看    
#3楼 2008-04-10 09:05 | 生鱼片      
支持下
  回复  引用  查看    
#4楼 2008-04-10 09:13 | good man      
博主有没有人零开始讲的东西啊,我现还没有基础哟,听起来有一点晕啊
对了,VS2005,里面可以做吗?
  回复  引用  查看    
#5楼 [楼主]2008-04-10 10:06 | 李永京      
@李战
o(∩_∩)o...
  回复  引用  查看    
#6楼 [楼主]2008-04-10 10:08 | 李永京      
@彩云飞
开始学习,先明白怎么实现,至于安全性等基础部分弄明白,在考虑一下,等完成系列的最后在看看有没有这方面的资料学习一下。
  回复  引用  查看    
#7楼 [楼主]2008-04-10 10:09 | 李永京      
@生鱼片
谢谢支持!
  回复  引用  查看    
#8楼 [楼主]2008-04-10 10:11 | 李永京      
@good man
一些关于Silverlight 2 Beta1的基础知识可以去看TerryLee的一步一步学Silverlight 2系列文章
Silverlight 2使用VS2008开发的。VS2005不可以。
对于数据操作,这篇和上一篇讲的非常详细了。
  回复  引用    
#9楼 2008-04-10 11:06 | czben [未注册用户]
能把这个例子的代码提供下载吗?
  回复  引用  查看    
#10楼 [楼主]2008-04-10 11:14 | 李永京      
@czben
晚上整理一下。
  回复  引用  查看    
#11楼 2008-04-10 14:51 | aspnetx      
老大能否说下crossdomain.xml?为什么我写好后放到WS根目录后还是不行呢?
  回复  引用    
#12楼 2008-04-11 08:38 | 跑龙套的 [未注册用户]
楼主,麻烦把界面代码也贴出来下
  回复  引用  查看    
#13楼 [楼主]2008-04-11 09:58 | 李永京      
@aspnetx
见(1)的回复
  回复  引用  查看    
#14楼 [楼主]2008-04-11 10:16 | 李永京      
@跑龙套的
提供下载了。
  回复  引用    
#15楼 2008-04-14 11:57 | 锦瑟 [未注册用户]
我记得SL1.1里如果是要访问webservice,必须是Scriptable的才行,2.0里做过更新了?
  回复  引用  查看    
#16楼 [楼主]2008-04-14 12:35 | 李永京      
@锦瑟
我对1.1还不清楚,2.0对1.1有了很大的改进及增强!
  回复  引用    
#17楼 2008-04-17 23:27 | ZeroWinNing [未注册用户]
我一步一步照着做,可是做到
后台代码
//按钮事件

errMessage.Foreground = new SolidColorBrush(Colors.Red);
CreateUserCompletedEventArgs>userMgrSoapClient_CreateUserCompleted);


做不下去了,请问是不是,有些步骤不全啊?
希望开放源码!
  回复  引用  查看    
#18楼 [楼主]2008-04-18 08:04 | 李永京      
@ZeroWinNing
errMessage是前台的一个控件
不是已经提供源代码下载了吗?
  回复  引用    
#19楼 2008-04-22 22:21 | hyh [未注册用户]
源代码下不了啊
希望版主提供
  回复  引用    
#20楼 2008-04-22 22:22 | hyh [未注册用户]
还有
Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
好像没找到 (下)
  回复  引用    
#21楼 2008-04-22 22:28 | hyh [未注册用户]
方便的话发我邮箱也行 谢谢
  回复  引用  查看    
#22楼 [楼主]2008-04-22 22:51 | 李永京      
@hyh
可以下载的啊,点击进去,就可以下载了,我发你邮箱吧。
Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下) 现在正在写,明天中午贴出来,最近时间紧的很,不好意思。
  回复  引用    
#23楼 2008-04-22 23:15 | hyh [未注册用户]
版主回复这么快,很是感动,希望多交流。
我要用实际行动回报你的支持-->每天都访问你的博客。
  回复  引用    
#24楼 2008-04-23 14:40 | hyh [未注册用户]
期待Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
关于Silverlight 2 (beta1)操作数据库的方法,您已经介绍了3种,我们的应用也就是做做网站的后台,不知道哪种方法最简单?哪种方法最有发展前景?

  回复  引用  查看    
#25楼 [楼主]2008-04-23 17:35 | 李永京      
@hyh
不用每天访问,只要订阅一下就可以了。
Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下) 发布了,不好意思,时间紧
在Silverlight 2 (beta1)数据操作(5)中说到了,大致分3层
在数据访问层LINQ to SQL,在Web Service层使用WCF,最后在客户端Silverlight完成调用。这个好像是推荐的做法。
在数据访问层有很多技术可以使用,像NHibernate、NetTiers 、LINQ to SQL、Entity Framework、Astoria (ADO.NET Data Services) ,不过Entity Framework、Astoria (ADO.NET Data Services)还是Beta阶段,这些将成为NET3.5SP1的一部分,那时会是正式发布的。
服务层就是在Silverlight客户端与Web服务端提供一个通道,官方推荐使用WCF来读取,当然ASMX也可以。我想不久将来微软可能专门为Silverlight设计一个Silverlight-Enabled WCF Service,不过现在使用WCF Service也可以访问。

  回复  引用    
#26楼 2008-04-24 00:58 | hyh [未注册用户]
谢谢解答,仔细研究了您的几篇大作,似乎有些眉目了,向您学习!
  回复  引用    
#27楼 2008-05-15 11:03 | 欧阳继 [未注册用户]
楼主,看了你的文章收获很多,但源代码下载不了,能发我一份吗?我邮箱:278823150@qq.com,谢谢
  回复  引用  查看    
#28楼 [楼主]2008-05-15 11:29 | 李永京      
@欧阳继
我在博客园上传了文件 http://www.cnblogs.com/Files/lyj/YJingLee.WebSrv.rar 自己下载一下~~~
  回复  引用    
#29楼 2008-05-26 11:38 | 路过 [未注册用户]
  回复  引用  查看    
#30楼 [楼主]2008-05-26 12:00 | 李永京      
@路过
我可没有说自己的大作哦。呵呵,分享是关键的~~
  回复  引用    
#31楼 2008-07-13 22:59 | 孤鹰 [未注册用户]
楼主在2008-04-23 17:35预言“微软可能专门为Silverlight设计一个Silverlight-Enabled WCF Service”,现在Silverlight 2 Beta 2中果然有了!佩服!佩服!
  回复  引用    
#32楼 2008-07-13 23:06 | 路过 [未注册用户]
@孤鹰
不知道说你什么好,楼主的文章都是翻译的别人的文章,是老外的预言,或者说是Silverlight开发人员说的话!!!
  回复  引用    
#33楼 2008-07-16 15:46 | wulei99 [未注册用户]
程序中存在漏洞,比如创建用户在webservice中调用CreateUser这个方法时候返回false。在前台页面中仍然不能判断,e.Error值为空不能正确接受错误信息,显示的是创建成功。
—问题是如何接收到正确的错误信息。
  回复  引用  查看    
#34楼 [楼主]2008-07-28 23:16 | 李永京      
@孤鹰
呵呵,那个不是翻译的,是看一个国外视频中,开发人员说的,我没有预言啊

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-15 11:32 编辑过