`
deer
  • 浏览: 86412 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

WPF 一个简单的示例

阅读更多

最近公司让学WPF,在网上找了个例子,调了一下,在这儿跟大家分享,还存在许多问题,大家共同研究:

参考:http://www.zhiweinet.com/jiaocheng/2008-06/855.htm

首先是数据库连接上的一些问题:
   一:装上SQLSERVER 2005,以前登录直接选择'Windows身份验证',并没有什么问题出现!可前段时间采用'SQLSERVER身份验证'去登录,随之的问题就来了.无论用什么方法就是一个结果出错! 出错的原因是:'用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联'

/// 具体的方法是:   1:打开SQL Server Manager管理器!在左面找到 ‘安全性’ 单击右键 选择‘新建”,“登录” 弹出一个对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验证',并输入密码,可以把‘用户下次登录时必须修改密码’取消掉。 点击‘用户映射’,在右面选择要映射的数据库,并在前面打勾!在下面一栏中‘db-owner’和‘public’前面打勾。然后点击'状态'在右面栏中选中"授予"、“启用”,这两项一般是默认的,但如果默认的不是此两项必须改过来,不然是连不上的!点击‘确定’。
2:找到SQL服务器,在左栏中上面,单击右键,在弹出的菜单中选择“属性”命令。弹出一个对话框,单击“安全性”,在“服务器身份验证”下面选择“SQL SERVER和WINDOWS身份验证模式”,在前面打勾!记得这一步很重要,如果没有这一步你就别想登录成功!然后单击“确定”就可以了! 3:重新启动服务就可以选择SQL SERVER 身份验证模式登录了!输入刚才的用户名和密码就可以登录成功了!
二:
   C#中的字符串,如正则表达式中,有可能出现一些与C#语言相同的字符,比如"\",会让编译器作为C#语言来识别,截断该字符串,并可能产生编译器错误.
为了防止这种情况的发生,在该字符串前加一个"@"就是告诉编译器,这些特殊字符是作为字符串中的一部分存在的,编译器就不会去编译它了.
比如路径"c:\abc\d.txt"将产生编译器错误,之前可以写为"@c:\abc\d.txt"便得到其真实路径了.

下面是关于WPF的例子:

数据库:Test表:t_admin,person
t_admin(pId,pPwd)字段都是字符型的
person(ContactId,FirstName,LastName,EmailAddress)字段都是字符型的


登陆窗口Window2.xaml:
 
<Window x:Class="WPFTest.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="登陆界面" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="27*" />
            <RowDefinition Height="175*" />
            <RowDefinition Height="60*" />
            
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Background="BlueViolet">
            <TextBlock Grid.Row="0"  HorizontalAlignment="Center"  Height="25" Name="title" Width="auto"  Text="登陆界面" FontSize="16" />      
        </StackPanel>
      
        <WrapPanel Grid.Row="1" Orientation="Horizontal" Margin="0,10,0,0">
            <StackPanel Height="37" Margin="0,13,0,0" Name="stackPanel1" VerticalAlignment="Top"   Orientation="Horizontal">
            <TextBlock Height="25" Name="textBlock1" Width="75"  Text=" 用户ID:"/>
            <TextBox Name="userID" Width="182" Height="26" />
        </StackPanel>
        <StackPanel Margin="0,13,0,10" Name="stackPanel2"  Orientation="Horizontal">
            <TextBlock Height="25" Name="textBlock2" Width="75"  Text=" 密码:"/>
            <PasswordBox Height="26" Name="userPwd" Width="182" />
        </StackPanel>

         <Label Height="26" Name="errMess" Width="268" Visibility="Hidden"></Label>
            
        </WrapPanel>
      
        <Button Grid.Row="2" Margin="84,13,111,10" Name="btnLogin" Click="btnLogin_Click" >登陆</Button>
        <Button Grid.Row="2" HorizontalAlignment="Right" Margin="0,13,10,12" Name="button1" Width="81" Click="button1_Click">关闭</Button>
    </Grid>
</Window>


对应的Window2.xaml.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.SqlClient;


namespace WPFTest
{
    /// <summary>
    /// Window2.xaml 的交互逻辑
    /// </summary>
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();
            this.errMess.Visibility = Visibility.Hidden;

        }

        private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            SqlConnection myConn = null;
            try
            {
                myConn = this.createConn();
                myConn.Open();

                string uid = this.userID.Text.Trim();
                string upwd = this.userPwd.Password;

                string mySql = "select count(*) from dbo.T_admin where pID = '" + uid+"' and pPwd = '"+upwd+"'";
                SqlCommand cmd = new SqlCommand(mySql, myConn);

                int count = Convert.ToInt32(cmd.ExecuteScalar());

                if (count > 0)
                {
                    //隐藏登陆界面,显示查询界面
                    this.Hide();
                    Window win1 = new Window1();
                    win1.Show();
                }
                else
                {
                    this.errMess.Visibility = Visibility.Visible;
                    this.errMess.Content = "登陆失败!";
                }

            }
           
            finally 
            {
                myConn.Close();
            }

        }

        private SqlConnection createConn() 
        {
            SqlConnection conn = new SqlConnection(@"server=.\SQLEXPRESS;database=Test;uid=login;password=login");
            //SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test.MDF;Integrated Security=True;User Instance=True"); 
            return conn;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        
    }
}

数据的增删改查界面Window1.xaml:
<Window x:Class="WPFTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="查询界面" Height="300" Width="300" IsEnabled="True">
    <Grid Background="Aquamarine" Opacity="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="auto" MinHeight="100" />
            <RowDefinition Height="22" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions >
            
        </Grid.ColumnDefinitions>

            <ListView  Height="280"  Name="listView1" VerticalAlignment="Top"  MinWidth="280" SelectionChanged="listView1_SelectionChanged">
            <ListView.View >
                <GridView x:Name="gridView1">
                    <GridViewColumn  Header="ContactID" DisplayMemberBinding="{Binding Path=ContactID}" ></GridViewColumn >
                    <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding Path=FirstName}"></GridViewColumn>
                    <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding Path=LastName}"></GridViewColumn>
                    <GridViewColumn Header="EmailAddress" DisplayMemberBinding="{Binding Path=EmailAddress}"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView> 
        <WrapPanel Grid.Row="1" Height="100" Orientation="Horizontal" DataContext="{Binding ElementName=listView1,Path=SelectedItem}">
            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_ContactID" Text="ContactID:" />

                <TextBox Name="textBox_ContactID" MinWidth="100" Text="{Binding ContactID}" IsEnabled="True" />

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_FirstName" Text="FirstName:"  />

                <TextBox Name="textBox_FirstName" MinWidth="100" Text="{Binding FirstName}"/>

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_LastName" Text="LastName:" />

                <TextBox Name="textBox_LastName" MinWidth="100" Text="{Binding LastName}"/>

            </StackPanel>

            <StackPanel Orientation="Horizontal" Margin="5,2,5,2">

                <TextBlock Name="textBlock_EmailAddress" Text="EmailAddress:" />

                <TextBox Name="textBox_EmailAddress" MinWidth="100" Text="{Binding EmailAddress}"/>

            </StackPanel>
            
        </WrapPanel>
        
        <StackPanel Orientation="Horizontal" Margin="5,2,5,2" Grid.Row="2" >
            <Button  HorizontalAlignment="Right"  Name="btnUpdata" Click="btnUpdata_Click"  >数据更新</Button>
            <Button  HorizontalAlignment="Center"  Name="btnAdd" Click="btnAdd_Click">添加</Button>
            <Button  HorizontalAlignment="Left"  Name="btnDell" Click="btnDell_Click">删除</Button>
            <Button  HorizontalAlignment="Left"  Name="button2" Width="57" Click="button2_Click">调用</Button>

        </StackPanel>
      

    </Grid>
</Window>


对应的Window1.xaml.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data.SqlClient;
using System.Data;

namespace WPFTest
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            getData();

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            getData();
        }

        private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
           // this.textBox_ContactID.IsEnabled = false;

            textBox_ContactID.SetValue( TextBox.IsEnabledProperty, Convert.ToBoolean(false));
        }
        void getData() 
        { 
            //初始化数据连接.
            SqlConnection Myconn = this.createConn();

            //建立连接

            SqlDataAdapter sda = new SqlDataAdapter("select ContactID,FirstName,LastName,EmailAddress from dbo.person where ContactID<=100;", Myconn);
            //SqlCommandBuilder commBuilder = new SqlCommandBuilder(sda);
            //sda.UpdateCommand = commBuilder.GetUpdateCommand();
            
            DataTable dt =  new DataTable();

            //sda.AcceptChangesDuringUpdate = true;
            sda.Fill(dt);

            //与界面绑定
            this.listView1.ItemsSource = dt.DefaultView;
            Myconn.Close();
               
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            Window win = new Window2();
            win.Show();
        }
        private SqlConnection createConn()
        {
            SqlConnection conn = new SqlConnection(@"server=.\SQLEXPRESS;database=Test;uid=login;password=login");
            //SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test.MDF;Integrated Security=True;User Instance=True"); 
            return conn;
        }

        /*
         * 数据的更新
         * 
         * 
         */
        private void btnUpdata_Click(object sender, RoutedEventArgs e)
        {
            string id = this.textBox_ContactID.Text.ToString();
            string firstName = this.textBox_FirstName.Text.ToString();
            string lastName = this.textBox_LastName.Text.ToString();
            string eMail = this.textBox_EmailAddress.Text.ToString();
            SqlConnection Myconn = this.createConn();
            Myconn.Open();
            try 
            {
                SqlCommand cmd = new SqlCommand("update dbo.person set FirstName = '" + firstName + "',LastName='" + lastName + "',EmailAddress='" + eMail + "' where ContactID = '" + id + "'",Myconn);
                //SqlDataAdapter sda = new SqlDataAdapter("updata dbo.person set FirstName = '" + firstName + "',LastName='" + lastName + "',EmailAddress='" + eMail + "' where ContactID = '" +id+"'");
                cmd.ExecuteNonQuery();
                MessageBox.Show("更新成功!");

            }catch(Exception ex)
            {
                ex.ToString();
                MessageBox.Show("更新失败!");
            }
            finally 
            {
                Myconn.Close();
            }
           
        }

        /*
         * 数据的添加
         * 
         * 
         */
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            string id = this.textBox_ContactID.Text.ToString();
            string firstName = this.textBox_FirstName.Text.ToString();
            string lastName = this.textBox_LastName.Text.ToString();
            string eMail = this.textBox_EmailAddress.Text.ToString();
            

            if (!this.IsHasData(id))
            {
                //不存在,进行数据添加
                SqlConnection Myconn = this.createConn();
                Myconn.Open();
                try
                {
                    string sql = "insert into dbo.person(ContactID,FirstName,LastName,EmailAddress) values('"+id+"','"+firstName+"','"+lastName+"','"+@eMail+"')";
                    SqlCommand cmd = new SqlCommand(sql,Myconn);
                    cmd.ExecuteNonQuery();

                    MessageBox.Show("数据添加成功!");
                   
                    //不通过后台查询,直接反映到前台
                    //this.gridView1.Columns.Add(gvc);
                   

                }
                catch (SqlException ex)
                {
                    ex.ToString();
                    MessageBox.Show("数据添加失败!");
                }
                finally 
                {
                    Myconn.Close();
                }
               
                // 通过后台查询反映到前台
                getData();
            }
            else 
            {
                //存在
                MessageBox.Show("数据ID已经存在!");
            }

        }

        /*
         * 判断是否存在数据
         * 
         * 
         */
        private bool IsHasData(string id) 
        {
            SqlConnection Myconn = this.createConn();
            Myconn.Open();
            try 
            {
                SqlCommand cmd = new SqlCommand("select count(*) from dbo.person where ContactID='" + id +"'",Myconn);
                int count = Convert.ToInt32(cmd.ExecuteScalar());
                if (count > 0)
                {
                    return true;
                }
                else 
                {
                    return false;
                }
            }
            catch(Exception ex)
            {
                ex.ToString();
                return false;
            }
            finally
            {
                Myconn.Close();
               
            }
        }
       /*
        * 数据的删除
        * 
        * 
        */
        private void btnDell_Click(object sender, RoutedEventArgs e)
        {
            string id = this.textBox_ContactID.Text.ToString();
            if(this.IsHasData(id))
            {
                //数据存在进行删除
                SqlConnection Myconn = this.createConn();
                Myconn.Open();
                try 
                {
                    string sql = "delete from dbo.person where ContactID ='"+ id+"'";
                    SqlCommand cmd = new SqlCommand(sql,Myconn);
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("删除成功!");

                    //不通过后台查询,直接反映到前台
                    //this.gridView1.Columns.Add(gvc);

                }
                catch(SqlException ex)
                {
                    ex.ToString();
                }
                finally
                {
                    Myconn.Close();
                }

                // 通过后台查询反映到前台
                getData();
            }
        }
    }
}


注意:启动窗口设置为Window2
修改:App.xaml
<Application x:Class="WPFTest.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window2.xaml">
    <Application.Resources>
         
    </Application.Resources>
</Application>


调试过程中的一个问题:
错误一:ExecuteNonQuery (或者ExecuteReader): Connection property has not been initialized

缺少参数:

下面是网上的摘抄:

using (SqlConnection conn = SqlHelper.GetSqlConnection())
{
    conn.Open ();
    //Create table.
    using (SqlCommand cmd = new SqlCommand (_cmdCreateTable))
    {
        cmd.ExecuteNonQuery ();
    }
}
估计一下子还真不容易看出来,那就是
new SqlCommand (_cmdCreateTable)
缺少第二个参数:SqlConnection!


错误二:过程或函数 'xxx' 需要参数 '@xxx',但未提供该参数
这个可能原因就更多了,不过到后来我都排除了,最后发现是没有将SqlCommand对象的CommandType设为StoredProcedure! 真是囧了。不过还是挺奇怪的,毕竟没有设的话默认是Text,也就是说它会将存储过程名称当做SQL语句,那此时应该是它不需要参数而我给了参数(原本要传给存储过程的),所以这个错误信息实在是。。。




  • 大小: 10.8 KB
  • 大小: 27.4 KB
分享到:
评论

相关推荐

    wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例

    wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf示例wpf...

    wpf mvvm设计模式示例

    总结来说,“wpf mvvm设计模式示例”是一个演示如何在WPF中运用MVVM模式的实例,它通过一个简单的列表展示了MVVM模式的基本结构和工作原理,包括模型、视图、视图模型的职责划分,数据绑定、命令以及依赖属性和...

    WPFDataGrid和LINQtoSQL示例程序

    在本文中,我们将深入探讨`WPFDataGrid`和`LINQ to SQL`技术,并通过一个实际的示例程序来阐述它们如何协同工作。`WPFDataGrid`是Windows Presentation Foundation(WPF)框架中的一个控件,用于展示数据集并在用户...

    WPF MVVM完整示例(登录窗口)

    本示例中的"LoginDemo"是基于WPF和MVVM模式的一个登录窗口应用,涵盖了多个关键知识点。 1. **MVVM模式基础**:MVVM模式的核心在于ViewModel,它是View和Model之间的桥梁。ViewModel通过属性和命令暴露其功能,View...

    WPF-DragDropImage简单示例

    在ImageGallery_Ex01这个示例项目中,你可能会找到一个简单的拖放图片应用程序。代码可能包括一个或多个Canvas元素,用于接收拖放的图片;使用IDataObject实现拖放逻辑;定义样式以改变被拖放图片的外观;以及可能...

    WPF 记事本 wpf 程序示例 记事本

    在本示例中,我们将深入探讨如何利用WPF来创建一个基本的记事本程序。这个程序将会包括常见的文本编辑功能,如打开、保存、复制、粘贴等。 ### WPF基础 WPF是基于XAML(Extensible Application Markup Language)...

    wpf路由事件简单示例

    标题"wpf路由事件简单示例"指向了一个演示如何使用路由事件的实际应用,即模拟牧场农场跳转。这个场景可能是一个简单的用户界面,通过点击按钮或执行其他交互来展示不同的农场场景。 路由事件分为三种类型:...

    微软WPF示例源码大全

    这个“微软WPF示例源码大全”集合包含了一系列官方示例,涵盖了WPF的多个核心功能和特性,对于开发者来说,是深入理解和学习WPF技术的宝贵资源。 1. **WPFHostingWin32Control.zip**: 这个示例展示了如何在WPF...

    WPF 各种界面功能示例

    9. **DrawToolsWPF2010.rar** - 类似于上一个示例,这可能是另一个画板应用,可能包含更多的绘图工具和功能,适用于2010版的WPF环境。 10. **窗体页面切换.rar** - 这个示例可能涉及到WPF中的导航架构,展示了如何...

    WPF-MVVM-简单示例

    这个“WPF-MVVM-简单示例”是一个很好的学习资源,它展示了如何利用MVVM模式、LINQ和WPF的数据绑定特性来构建一个功能齐全的应用程序。通过理解并实践这个示例,开发者可以更好地掌握现代WPF开发的核心技术,为更...

    wpf control template 示例

    本示例聚焦于如何重写常见控件(如Button, TextBox, ListBox等)的ControlTemplate,这对于WPF初学者来说是一个极其有益的学习资源。通过理解并实践这些例子,你可以深入理解WPF的模板化系统,并能够创建出独具特色...

    WPF图片查看器示例

    "WPF照片查看器示例"是一个展示如何在WPF应用中实现高效、交互式的图片浏览功能的经典代码实例。 1. **WPF中的Image控件** WPF提供了`Image`控件,用于显示位图、图标和其他图像资源。在WPF照片查看器中,`Image`...

    基于WPF技术的Chart示例

    在本文中,我们将深入探讨如何使用Windows Presentation Foundation (WPF)技术来创建具有...这个基于WPF技术的Chart示例是一个很好的起点,对于希望在WPF应用中实现数据可视化的开发者来说,无疑是一份宝贵的参考资料。

    WPF示例代码

    在这个名为“WPF示例代码”的压缩包中,我们可能找到了一个关于如何使用ObjectDataProvider和MultiBinding的实际应用案例。文件名“WPF_Color”可能暗示了这是一个涉及颜色处理的例子,可能是如何根据多个输入(如...

    WPF版本Visifire图表示例

    总结起来,这个"WPF版本Visifire图表示例"项目是一个很好的学习资源,展示了如何在WPF应用中利用Visifire库创建美观且功能丰富的图表。通过理解和实践这个示例,开发者可以更好地掌握WPF图表的实现方法,并将其应用...

    wpf布局管理代码示例

    WPF还支持嵌套布局,即在一个布局管理器内部使用另一个布局管理器。这种方式可以组合多种布局的优点,实现更复杂的界面设计。 9. AutoSize和Min/MaxSize属性: 在每个布局中,控件的Size属性都可以设置为自动(Auto)...

    wpf google map v3 示例

    综上所述,"wpf google map v3 示例"是一个展示如何在WPF中集成Google Maps API V3并实现动态添加标记的示例。它涵盖了WPF WebBrowser控件的使用、JavaScript与C#的交互、Google Maps API的API调用等多个技术点,...

    wpf全面资料含示例

    在“wpf全面资料含示例”这个压缩包中,我们可以期待找到关于WPF的全面学习资料,包括理论知识和实践示例。通过深入学习这些内容,开发者可以掌握WPF的核心概念和技术,从而高效地创建出美观且功能强大的Windows桌面...

    一个wpf+wcf的示例程序(适合初学者)

    **WCF** 是一个全面的、统一的框架,用于构建面向服务的应用程序。它允许开发者通过多种协议(如HTTP、TCP、MSMQ等)和各种传输机制来创建、发布、发现和调用服务。`BJCreation.Courseware.BLL`可能包含了业务逻辑层...

Global site tag (gtag.js) - Google Analytics