2012年3月31日星期六

WP7 SkyDrive API 调用

WP7 SkyDrive API 调用



SkyDriveAPI是微软Windows Live免费服务公开的API的一部分,Live服务包括:MSN个人信息、Hotmail、日历、联系人、SkyDrive、Messager几部分,使用方法大概相似,都是先要登陆授权,然后用授权得到的凭证使用API操作服务。

因本人用到SkyDrive,现着重介绍SkyDrive.

 

这是学习开始页面,所有的信息都可以从在这里获取,当然这里的信息量比较大

 

SkyDrive的调用方法有很多,如果你用C#,那么你有福了,MS的大集成战略让你可以用现成的SDK,而且现在又有SDK 5.1Preview,可以使用async和await~~~如果您用其他方式,可以通过OAuth 2.0, JavaScript Object Notation (JSON), and Extensible Messaging and Presence Protocol (XMPP),具体的实现方式,可以看这些Sample 。这里就不一一详细说了,只说一下WP7平台下的粗略使用。

 

先推荐几个资源

SDK在线测试工具:http://isdk.dev.live.com/ISDK.aspx

一步步开始En版:http://msdn.microsoft.com/en-us/windowslive/ff621314

API类库文档:http://msdn.microsoft.com/library/hh243650.aspx

 

在继续往下了解之前,我想先弄明白几个概念

什么是REST表述性状态转移(Representational State Transfer)?

         REST的概念始于2000年,可以看这个《架构风格与基于网络的软件架构设计》,推荐阅读第五章,简单点,也可以看百度百科,我理解就是将请求的操作资源化,Get,Login等操作都是对某一个资源的操作,而操作资源的方式就是GET http或者POST http,当然 还有其他的。这些请求没有返回的状态,不是事件驱动的,不会像WCF的svc这种服务文件一样,你请求的时候会有Complete事件中而且有一个返回的e.Result。REST的好处能 减轻服务器的压力,因为不需要服务器返回状态,部署的资源通过URI链接都可被访问和操作,有利于服务间的互操作。

通过这个概念的了解我们就可以更容易的理解REST API了,以File object为例子

获取File属性的GET URI为:https://apis.live.net/v5.0/me/FILE_ID?access_token=ACCESS_TOKEN

获取File内容的GET URI为:https://apis.live.net/v5.0/me/FILE_ID/content?access_token=ACCESS_TOKEN

上传File的PUT URI为:

https://apis.live.net/v5.0/me//FOLDER_ID/files/file1.txt/content?access_token=ACCESS_TOKEN

但是在用PUT方法的时候要将

Content-Type: multipart/form-data; boundary=AaB03x

Content-Disposition: file; filename="file1.txt"

写上。

什么是Scopes在使用API之前,你需要对所做的操作获取权限,形式如下:

JavaScript:

WL.login(

{ "scope": "wl.skydrive" },

function (response) {

if (response.status == "connected") {

getFiles();

}

else {

log("Could not connect, status = " + response.status);

}

});

C#:

<live:SignInButton ClientId="000000004C091545" Scopes="wl.signin wl.skydrive"/>

OAuth 2.0:

https://oauth.live.com/authorize?client_id=0000000603DB0F&scope=wl.signin%20wl.basic&response_type=code&redirect_uri=http%3A%2F%2Fwww.contoso.com%2Fcallback.php

the response for the HTTP POST request如果成功,会返回

{

"access_token": "EwCo...//access token string shortened for brevity//...AA==",

"expires_in": 3600,

"scope": "wl.signin wl.basic",

"token_type": "bearer"

}

其实理解了这几个概念剩下的就好说了

访问API必备的条件,

1、操作方式:me/FILE_ID,你要做什么样的操作

2、ClientId:000000004C091545,你应用的客户ID

3、Scopes:wl.signin wl.skydrive你所操作的权限

有了2、3要素,就可以切换到请求登录页面获取第4个要素

4、Token或者Session

有了4 要素,结合不同的1要素就可以访问Live的各种API了

 

首先为了取到ClientID,要注册授权应用

https://manage.dev.live.com/Applications/Index

可在此处注册你的授权应用

 

剩下的步骤就代码吧

1、前台的登录按钮

<live:SignInButton x:Name="skyLogin" ClientId="000000004C091545" Scopes="wl.signin wl.basic wl.skydrive" Branding="Skydrive" TextType="SignIn" SessionChanged="SignInButton_SessionChanged"
/>

2、对应的后台事件

//登陆

private LiveConnectClient client;private void SignInButton_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e){if (e.Status == LiveConnectSessionStatus.Connected){client = new LiveConnectClient(e.Session);}}
通过这两步,取到了
LiveConnectClient client

3、获取SkyDrive的文件信息:

client.GetAsync("me/skydrive/files")client.GetCompleted +=newEventHandler<LiveOperationCompletedEventArgs>(getFolderProperties_Completed);//将文件树信息用ListBox展示void getFolderProperties_Completed(object sender, LiveOperationCompletedEventArgs e){if (e.Error == null){IDictionary<string, object> result = e.Result;var data = result["data"];var folders = data asList<object>;var folderSource = newObservableCollection<FolderFile>();for (int i = 0; i < folders.Count; i++){folderSource.Add(newFolderFile(){ID = (folders[i] asIDictionary<string, object>)["id"].ToString(),Name = (folders[i] asIDictionary<string, object>)["name"].ToString(),Type = (folders[i] asIDictionary<string, object>)["type"].ToString(),ParentID = (folders[i] asIDictionary<string, object>)["parent_id"].ToString()});}lstFiles.ItemsSource = folderSource.Where(p => p.Type == "folder" || p.Type == "file");}else{MessageBox.Show(e.Error.Message);}}
当然也可以通过其他的方式获取,这里就不一一列举了。写的有什么不对的地方,希望能与大家交流,欢迎拍砖。

http://blog.bryht.net

TAG:

Kinect for Windows SDK开发入门(二):基础知识 上

Kinect for Windows SDK开发入门(二):基础知识 上



    上篇文章介绍了Kinect开发的环境配置,这篇文章和下一篇文章将介绍Kinect开发的基本知识,为深入研究Kinect for Windows SDK做好基础。

    每一个Kinect应用都有一些基本元素。应用程序必须探测和发现链接到设备上的Kinect传感器。在使用这些传感器之前,必须进行初始化,一旦初始化成功后,就能产生数据,我们的程序就能处理这些数据。最后当应用程序关闭是,必须合理的释放这些传感器。

    本文第一部分将会介绍如何探测初始化几释放传感器,这是非常基础的话题,但是对于基于Kinect开发的应用程序非常重要。一旦初始化好了之后,Kinect的各种传感器就能够产生数据。我们的程序可以读取这些数据流。Kinect产生的数据流类类似于System.IO命名空间下面的IO数据流。

    第二部分将详细介绍数据流的基础,并演示如何从Kinect中使用ColorImageStream获取彩色摄像头产生的数据。数据流能够生产基于像素的数据,使得能够像从相机或者基本的相片那样生产彩色图像。可以对这些数据进行各种有趣的处理。

    本文是整个Kinect SDK开发的基础部分,了解了这些之后,对于熟悉SDK中其他部分比较有帮助。

 

1. Kinect传感器

    基于Kinect开发的应用程序最开始需要用到的对象就是KinectSensor对象,该对象直接表示Kinect硬件设备。KinectSensor对象是我们想要获取数据,包括彩色影像数据,景深数据和骨骼追踪数据的源头。本文将详细介绍ColorImageStream,后面的文章将详细讨论DepthImageStream和SkeletonStream。

    从KinectSensor获取数据最常用的方式是通过监听该对象的一系列事件。每一种数据流都有对应的事件,当改类型数据流可用时,就会触发改时间。每一个数据流以帧(frame)为单位。例如:ColorImageStream当获取到了新的数据时就会触发ColorFrameReady事件。当在讨论各个具体的传感器数据流是我们将会详细讨论这些事件。

    每一种数据流(Color,Depth,Skeleton)都是以数据点的方式在不同的坐标系中显示的,在后面的讨论中我们能够清楚的看到这一点。将一个数据流中的点数据转换到另一个数据流中是一个很常见的操作,在本文的后面将会讨论如何转换以及为什么这种转换很有必要。KinectSensor对象有一些列的方法能够进行数据流到数据点阵的转换,他们是MapDepthToColorImagePoint,MapDepthToSkeletonPoint以及MapSkeletonPointToDepth。在获取Kinect数据前,我们必须先发现连接的Kinect设备。发现Kinect设备很简单,但是也有需要主注意的地方。

 

1.1 发现连接的Kinect设备

    KinectObject对象没有公共的构造器,应用程序不能直接创建它。相反,该对象是SDK在探测到有连接的Kinect设备时创建的。当有Kinect设备连接到计算机上时,应用程序应该得到通知或者提醒。KinectSeneor对象有一个静态的属性KinectSensors,该属性是一个KinectSensorCollection集合,该集合继承自ReadOnlyCollection,ReadOnlyCollection集合很简单,他只有一个索引器和一个称之为StatusChanged的事件。

    使用集合中的索引器来获取KinectSensor对象。集合中元素的个数就是Kinect设备的个数。也就是说,一台电脑上可以连接多个Kinect设备来从不同的方向获取数据。应用程序可以使用多个Kinect设备来获取多方面的数据,Kinect个数的限制 只有电脑配置的限制。由于每个Kinect是通过USB来进行数据传输的,所以每一个Kinect设备需要一条USB线与电脑相连。此外,更多的Kinect设备需要更多的CPU和内存消耗。

    查找Kinect设备可以通过简单的遍历集合找到;但是KinectSensor集合中的设备不是都能直接使用,所以KinectSensor对象有一个Status属性,他是一个枚举类型,标识了当前Kinect设备的状态。下表中列出了传感器的状态及其含义:

image

    只有设备在Connected状态下时,KinectSensor对象才能初始化。在应用的整个生命周期中,传感器的状态可能会发生变化,这意味着我们开发的应用程序必须监控设备的连接状态,并且在设备连接状态发生变化时能够采取相应的措施来提高用户体验。例如,如果连接Kinect的USB线从电脑拔出,那么传感器的连接状态就会变为Disconnected,通常,应用程序在这种情况下应该暂停,并提示用户将Kinect设备插入到电脑上。应用程序不应该假定在一开始时Kinect设备就处于可用状态,也不应该假定在整个程序运行的过程中,Kinect设备会一直与电脑连接。

    下面,首先创建一个WPF应用程序来展示如何发现,获取Kinect传感器的状态。先建按一个WPF项目,并添加Microsoft.Kinect.dll。在MainWindows.xaml.cs中写下如下代码:

public partial class MainWindow : Window{    //私有Kinectsensor对象    private KinectSensor kinect;    public KinectSensor Kinect    {        get { return this.kinect;}        set {            //如果带赋值的传感器和目前的不一样            if (this.kinect!=value)            {                //如果当前的传感对象不为null                if (this.kinect!=null)                {                 //uninitailize当前对象                    this.kinect=null;                }                //如果传入的对象不为空,且状态为连接状态                if (value!=null&&value.Status==KinectStatus.Connected)                {                    this.kinect=value;                }            }        }    }    public MainWindow()    {        InitializeComponent();        this.Loaded += (s, e) => DiscoverKinectSensor();        this.Unloaded += (s, e) => this.kinect = null;    }    private void DiscoverKinectSensor()    {        KinectSensor.KinectSensors.StatusChanged += KinectSensors_StatusChanged;        this.Kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);    }    private void KinectSensors_StatusChanged(object sender, StatusChangedEventArgs e)    {        switch (e.Status)        {            case KinectStatus.Connected:                if (this.kinect == null)                    this.kinect = e.Sensor;                break;            case KinectStatus.Disconnected:                if (this.kinect == e.Sensor)                {                    this.kinect = null;                    this.kinect = KinectSensor.KinectSensors.FirstOrDefault(x => x.Status == KinectStatus.Connected);                    if (this.kinect == null)                    {                        //TODO:通知用于Kinect已拔出                       }                }                break;            //TODO:处理其他情况下的状态        }    }}

 

    上面的代码注释很详细,首先定义了一个私有变量kinect,应用程序应该定义一个私有的变量来存储对获取到的KincectSensor对象的引用,当应用程序不在需要KinectSensor产生数据时,可以使用这个局部变量来释放对KinectSensor对象的引用从而释放资源。我们还定义了一个Kinect属性来对这个私有变量进行包装,使用属性的目的是保证能够以正确的方式初始化和反初始化KinectSensor对象。在Set方法中我们可以看到,自由待赋值的对象的组航太是Connected的时候我们才进行赋值操作,任何将没有处在Connected状态的传感器对象复制给KinectSensor对象时都会抛出InvalidOperationException异常。

    在构造函数中有两个匿名方法,一个用来监听Loaded事件,一个用来监听Unloaded事件。当卸载时应该将Kinect属性置为空。在窗口的Loaded事件中程序通过DiscoverKinectSensor方法试图调用一个连接了的传感器。在窗体的Loaded和Unloaded事件中注册这两个事件用来初始化和释放Kinect对象,如果应用程序没有找到Kinect对象,将会通知用户。

    DiscoverKinectSensor方法只有两行代码,第一行代码注册StatusChanged事件,第二行代码通过lambda表达式查询集合中第一个处在Connected状态的传感器对象,并将该对象复制给Kinect属性。Kinect属性的set方法确保能都赋值一个合法的Kinect对象。

StatusChanged事件中值得注意的是,当状态为KinectSensor.Connected的时候,if语句限制了应用程序只能有一个kinect传感器,他忽略了电脑中可能连接的其他Kinect传感器。

    以上代码展示了用于发现和引用Kinect设备的最精简的代码,随着应用的复杂,可能需要更多的代码来保证线程安全以及能让垃圾回收器及时释放资源以防止内存泄露。

 

1.2 打开传感器

    一旦发现了传感器,在应用程序能够使用传感器之前必须对其进行初始化。传感器的初始化包括三个步骤。首先,应用程序必须设置需要使用的数据流,并将其状态设为可用。每一中类型的数据流都有一个Enable方法,该方法可以初始化数据流。每一种数据流都完全不同,在使用之前需要进行一些列的设置。在一些情况下这些设置都在Enable方法中处理了。在下面,我们将会讨论如何初始化ColorImageStream数据流,在以后的文章中还会讨论如何初始化DepthImageStream数据流和SkeletonStream数据流。

    初始化之后,接下来就是要确定应用程序如何使用产生的数据流。最常用的方式是使用Kinect对象的一些列事件,每一种数据流都有对应的事件,他们是:ColorImageStream对应ColorFrameReady事件、DepthImageStream对应DepthFrameReady事件、SkeletonStream对象对应SkeletonFrameReady事件。以及AllFramesReady事件。各自对应的事件只有在对应的数据流enabled后才能使用,AllFramesReady事件在任何一个数据流状态enabled时就能使用。

    最后,应用程序调用KinectSensor对象的Start方法后,frame-ready事件就会触发从而产生数据。

 

1.3 停止传感器

    一旦传感器打开后,可以使用KinectSensor对象的Stop方法停止。这样所有的数据产生都会停止,因此在监听frameready事件时要先检查传感器是否不为null。

    KinectSensor对象以及数据流都会使用系统资源,应用程序在不需要使用KinectSensor对象时必须能够合理的释放这些资源。在这种情况下,程序不仅要停止传单器,还用注销frameready事件。注意,不要去调用KinectSensor对象的Dispose方法。这将会阻止应用程序再次获取传感器。应用程序必须从启或者将Kinect从新拔出然后插入才能再次获得并使用对象。

 

2. 彩色影像数据流

    Kinect有两类摄像头,近红外摄像头和普通的视频摄像头。视频摄像头提供了一般摄像头类似的彩色影像。这种数据流是三中数据流中使用和设置最简单的。因此我将他作为Kinect数据流介绍的例子。

    使用Kinect数据流也有三部。首先是数据流必须可用。一旦数据流可用,应用程序就可以从数据量中读取数据并对数据进行处理和展现。一旦有新的数据帧可用,这两个步骤就会一直进行,下面的代码展现了如何初始化ColorImage对象。

public KinectSensor Kinect{    get { return this.kinect;}    set {        //如果带赋值的传感器和目前的不一样        if (this.kinect!=value)        {            //如果当前的传感对象不为null            if (this.kinect!=null)            {              UninitializeKinectSensor(this.kinect);              //uninitailize当前对象                this.kinect=null;            }            //如果传入的对象不为空,且状态为连接状态            if (value!=null&&value.Status==KinectStatus.Connected)            {                this.kinect=value;                InitializeKinectSensor(this.kinect);            }        }    }}private void InitializeKinectSensor(KinectSensor kinectSensor){    if (kinectSensor != null)    {        kinectSensor.ColorStream.Enable();        kinectSensor.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);        kinectSensor.Start();    }}private void UninitializeKinectSensor(KinectSensor kinectSensor){    if (kinectSensor != null)    {        kinectSensor.Stop();        kinectSensor.ColorFrameReady -= new EventHandler<ColorImageFrameReadyEventArgs>(kinectSensor_ColorFrameReady);    }}

    上面的代码对之前Kinect属性进行了修改,加粗为修改部分。新添加的两行调用了两个方法,分别初始化和释放KinectSensor和ColorImageStream对象。InitializeKinectSensor对象调用ColorImageStream的Enable方法,注册ColorFrameReady事件并调用start方法。一旦打开了传感器,当新数据帧大道是就会触发frameready事件,该事件触发频率是每秒30次。

在实现Kinect_ColorFrameReady方法前,我们先在XAML窗体中添加一些空间来展现获取到的数据,代码如下:

<Window x:Class="KinectApplicationFoundation.MainWindow"        ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        :x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="ColorImageStreamFromKinect" Height="350" Width="525">    <Grid>        <Image x:Name="ColorImageElement"></Image>    </Grid></Window>

 

    然后,在Kinect_ColorFrameReady方法中,我们首先通过打开或者获取一个frame来提取获Frame数据。ColorImageFrameReadyEventArgs对象的OpenColorImageFrame属性返回一个当前的ColorImageFrame对象。这个对象实现了IDisposable接口。所以可以将这个对象抱在using语句中的原因,在提取像素数据之前需要使用一个Byte数组保存获取到的数据。FrameObject对象的PixelDataLength对象返回数据和序列的具体大小。调用CopyPixelDataTo方法可以填充像素数据,然后将数据展示到image控件上,具体代码如下:

void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e){    using (ColorImageFrame frame = e.OpenColorImageFrame())    {        if (frame != null)        {            byte[] pixelData = new byte[frame.PixelDataLength];            frame.CopyPixelDataTo(pixelData);            ColorImageElement.Source = BitmapImage.Create(frame.Width, frame.Height, 96, 96,                                                         PixelFormats.Bgr32, null, pixelData,                                                         frame.Width * frame.BytesPerPixel);        }    }}

 

    运行程序,就能得到从Kinect获取的视频信息,如下图所示这是从Kinect彩色摄像头获取的我房间的照片。和一般的视频没什麽两样,只不过这个是从Kinect的视频摄像头产生的。

image

 

3. 结语

    本文简要介绍了Kinect开发会遇到的基本对象,Kinect物理设备的发现,KinectSensor对象的初始化,打开KinectSensor对象以及如何获取数据流,最后以ColorImageStream对象为例展示了如何从Kinect获取数据并展现出来。

    由于Kinect的彩色摄像头默认每秒产生30副ColorImageFrame,所以上面的应用程序会产生30个Bitmap对象,而且这些对象初始化后很快将变成垃圾等待垃圾回收器进行收集,当采集的数据量很大时,将会对性能产生影响。限于篇幅原因,下篇文章将会介绍如何对这一点进行改进,并将讨论获取Kinect传感器产生数据的两种编程模式:基于事件的模式和轮询的模式。以上内容希望对你有帮助。



TAG:Kinect

C# 利用反射方便取得DbDataReader里的值

C# 利用反射方便取得DbDataReader里的值



概述

在我以前做项目时,读DbDataReder里的值时都会用Reader.Read()然后根据名字来逐个读出.自从学会利用反射来读后,一切变得很容易.

以前的做法

定义一个Entity

    public class FileInformationModel      {        #region Public Property        /// <summary>        /// Gets and sets the file ID        /// </summary>        public string FileID { get; set; }        /// <summary>        /// Gets and sets the file name        /// </summary>        public string FileName { get; set; }        /// <summary>        /// Gets and sets the file save type        /// </summary>        public int? FileSaveType { get; set; }        /// <summary>        /// Gets and sets the file url        /// </summary>        public string FileUrl { get; set; }        /// <summary>        /// Gets and sets the file is new         /// </summary>        public bool? IsNew { get; set; }        /// <summary>        /// Gets and sets the file last access time        /// </summary>        public DateTime? LastAccessTime { get; set; }        /// <summary>        /// Gets and sets the file modity time        /// </summary>        public DateTime? ModifyTime { get; set; }        /// <summary>        /// Gets and sets the file version        /// </summary>        public int? Version { get; set; }        /// <summary>        /// Gets and sets the file content owner        /// </summary>        public string ContentOwner { get; set; }        /// <summary>        /// Gets and sets the file content type        /// </summary>        public string ContentType { get; set; }        /// <summary>        /// Gets and sets the file create date time        /// </summary>        public DateTime? CreateTime { get; set; }        /// <summary>        /// Gets and sets the file access control        /// </summary>        public string FileAccessControl { get; set; }        /// <summary>        /// Gets and sets the file from        /// </summary>        public string FileFrom { get; set; }        #endregion    }

 

然后读取DbDataReader

 

        /// <summary>        /// Execute reader by store procedure and parameter list        /// </summary>        /// <param name="cmdText">store procedure</param>        /// <param name="parameters">parameter list</param>        /// <returns>data reader</returns>        public DbDataReader ExecuteReader(string cmdText, List<DbParameter> parameters,out DbConnection conn)        {            lock (lockObject)            {                  conn = new MySqlConnection(ConnectionString);                MySqlCommand command = new MySqlCommand();                PrepareCommand(command, conn, cmdText, parameters);                MySqlDataReader mySqlDataReader = command.ExecuteReader();                return mySqlDataReader;            }        }

 

 

然后再如此读出数据

        /// <summary>        /// Query FileInformationModel entity list by FileInformationModel entity        /// </summary>        /// <param name="entity">FileInformationModel entity</param>        /// <returns>FileInformationModel entity list</returns>        public List<FileInformationModel> Query(FileInformationModel entity)        {           DbConnection conn;            var result =                ConvertDataReaderToList(DBHelp.ExecuteReader(Constants.spSelectFileInformationByCondition,                                                             GetParameters(entity),out conn));           ContentHelp.CloseConnection(conn);           return result;        }        /// <summary>        /// Convert data reader to FileInformationModel entity list        /// </summary>        /// <param name="reader">Db DataReader</param>        /// <returns>FileInformationModel entity list</returns>        private List<FileInformationModel> ConvertDataReaderToList(DbDataReader reader)        {            List<FileInformationModel> fileInformationList = new List<FileInformationModel>();            using (reader)            {                while (reader.Read())                {                    FileInformationModel entity = new FileInformationModel();                    entity.ContentType = ContentHelp.GetObjectToString(reader["ConntentType"]);                    entity.ContentOwner = ContentHelp.GetObjectToString(reader["ContentOwner"]);                    entity.CreateTime = ContentHelp.GetObjectToDateTime(reader["CreateTime"]);                    entity.FileAccessControl = ContentHelp.GetObjectToString(reader["FileAccessControl"]);                    entity.FileFrom = ContentHelp.GetObjectToString(reader["FileFrom"]);                    if (ContentHelp.GetObjectToString(reader["IsNew"]) != null)                        entity.IsNew = Convert.ToBoolean(ContentHelp.GetObjectToInt(reader["IsNew"]));                    entity.FileName = ContentHelp.GetObjectToString(reader["FileName"]);                    entity.FileSaveType = ContentHelp.GetObjectToInt(reader["FileSaveType"]);                    entity.FileUrl = ContentHelp.GetObjectToString(reader["FileUrl"]);                    entity.FileID = ContentHelp.GetObjectToString(reader["FileID"]);                    entity.LastAccessTime = ContentHelp.GetObjectToDateTime(reader["LastAccessTime"]);                    entity.ModifyTime = ContentHelp.GetObjectToDateTime(reader["ModifyTime"]);                    entity.Version = ContentHelp.GetObjectToInt(reader["Version"]);                    fileInformationList.Add(entity);                }            }            return fileInformationList;        }

 

 

利用反射后,一切变得很容易.

        /// <summary>        /// Execute reader by store procedure and parameter list        /// </summary>        /// <param name="cmdText">store procedure</param>        /// <param name="parameters">parameter list</param>        /// <returns>data reader</returns>         public List<T> ReadEntityList<T>(string cmdText, List<DbParameter> parameters) where T : new()        {            lock (lockObject)            {                using (MySqlConnection conn = new MySqlConnection(ConnectionString))                {                    using (MySqlCommand command = new MySqlCommand())                    {                        PrepareCommand(command, conn, cmdText, parameters);                        MySqlDataReader mySqlDataReader = command.ExecuteReader();                        return ReadEntityListByReader<T>(mySqlDataReader);                    }                }            }        }        /// <summary>        /// Read entity list by reader        /// </summary>        /// <typeparam name="T">entity</typeparam>        /// <param name="reader">data reader</param>        /// <returns>entity</returns>        private List<T> ReadEntityListByReader<T>(MySqlDataReader reader) where T : new()        {            List<T> listT = new List<T>();            using (reader)            {                while (reader.Read())                {                    T inst = new T();                    foreach (var pi in typeof (T).GetProperties(BindingFlags.Instance | BindingFlags.Public))                    {                        var obj = new object();                        try                        {                            obj = reader[pi.Name];                        }                        catch (Exception ex)                        {                            continue;                        }                        if (obj == DBNull.Value || obj == null)                            continue;                        var si = pi.GetSetMethod();                        if (si == null)                            continue;                        pi.SetValue(inst, obj, null);                    }                    listT.Add(inst);                }            }            return listT;        }

 

 

然后再这样取出来

        /// <summary>        /// Query FileInformationModel entity list by FileInformationModel entity        /// </summary>        /// <param name="entity">FileInformationModel entity</param>        /// <returns>FileInformationModel entity list</returns>        public List<FileInformationModel> Query(FileInformationModel entity)        {            return DBHelp.ReadEntityList<FileInformationModel>(Constants.spSelectFileInformationByCondition,                                                               GetParameters(entity));        }

 

 

用好反射,让Coding变得更容易.

欢迎各位参与讨论,如果觉得对你有帮助,请点击image    推荐下,万分谢谢.

作者:spring yang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。



TAG:

GridView使用Tip

GridView使用Tip



1. 内容为html时,默认显示的就是html内容,如何让浏览器解析html,方法就是让GridView不编码html。

a) 方法一:设置绑定列的HtmlEncode为false

<asp:GridView ID="gvMail" runat="server" AutoGenerateColumns="False" Width="700px" >

<Columns>

<asp:BoundField DataField="EFFDT" HeaderText="<%$ Resources:ApplyDt %>" DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" HtmlEncode="False" ></asp:BoundField>

</Columns>

</asp:GridView>

b) 方法二:在GridView的绑定事件中解码

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

if (e.Row.RowType == DataControlRowType.DataRow)

{

TableCellCollection cells = e.Row.Cells;

foreach (TableCell cell in cells)

{

cell.Text = Server.HtmlDecode(cell.Text);

}

}

}

2. 在GridView表头“HeaderText”中换行:使用<br />,并False掉编码

<Columns>

<asp:BoundField HeaderText="ddd<br/>www" HtmlEncode="false" />

</Columns>

参考资料:http://topic.csdn.net/u/20080822/09/895d3d7e-b447-4207-a70f-91f98994e0a3.html

3. 设置GridView显示格线(横竖都有),没研究明白,贴一段设置成功的代码,最重要的貌似是GridLines=”None”。

<asp:GridView ID="GridView1" runat="server" CellPadding="3" GridLines="None" BackColor="Black" CellSpacing="1">

<FooterStyle BackColor="#C6C3C6" ForeColor="Black" />

<RowStyle BackColor="#ECF5FF" ForeColor="Black" />

<SelectedRowStyle BackColor="#9471DE" Font-Bold="True" ForeColor="White" />

<PagerStyle BackColor="#C6C3C6" ForeColor="Black" HorizontalAlign="Right" />

<HeaderStyle BackColor="#A6CBEF" Font-Bold="True" ForeColor="#404040" BorderColor="#A6CBEF" />

</asp:GridView>

4. 设置GridView的整体宽度固定,不会因为内容过多而撑破

a) 首先要添加Width属性设置宽度;

b) 要在绑定事件中加上如下代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

e.Row.Attributes.Add("style", "word-break:break-all;word-wrap:break-word");

}

c) 参考资料:http://social.msdn.microsoft.com/Forums/en/295/thread/6a41348f-7810-4192-ab52-3cb3c05f796a

5. HTML标签的鼠标移动上去时的tip换行的方法是:使用“&#13;”。

6. C#获取中文星期几的方法

DateTime.Now.ToString("dddd", new System.Globalization.CultureInfo("zh-cn"))



TAG:

一些让你保持小脸的食物

一些让你保持小脸的食物



瘦身不等于瘦脸,尤其不健康的瘦身方式,如节食或者过度依赖减肥药,都是破坏身体健康的元凶,不仅会让身体状况变差,还会间接影响脸色,使眼周出现小细纹,脸颊乱冒痘痘,可说是得不偿失。  

每口食物两侧咀嚼30次

很多人都会忽略饮食习惯对瘦脸的功效,其实牙齿咀嚼时产生的唾液激素能够帮助活化大脑,让大脑更加积极地指挥身体的新陈代谢。而且多咀嚼纤维质含量高的食物,如芹菜,粗粮消化饼干,能够预防便秘,使身体常常保持轻盈状态。另外,牙齿的咬合还会使整个口腔的肌肉活动起来,不准确的咀嚼方丽不仅会影响你匀称的脸形,以至会使腮帮变得特别突出,这样即使吃得再少,也是一张大饼脸!

最好一口食物能够在牙齿两侧细嚼15-25下,而且要轻嚼慢咽,这样才华够让脸形越来越标致立体。

消退脸蛋肿胀感的高钾质餐,能够帮助消退小脸浮肿的高钾质食物,和能够帮助正常牙齿咀嚼咬合的食物,都是瘦小脸不可或缺的功臣。钾质可以促进体内代谢功能,排除因为不当饮食或生活习惯所产生的脸部肿胀问题,高纤维质的海藻类、豆腐、豆干及青菜水果,都是小脸的贴心宝贝。

一些让你保持小脸的食物

菠菜:小小一把的菠菜就含有丰富的钾及维生素A和C,但是特别需要注意烹饪方式,菠菜的营养可是相当轻易流失掉哦。

豆苗:绿色的豆苗菜含有相当丰富的营养,其中当然少不了有利于消退水肿的钾,而且豆苗可以强化咀嚼效果,是兼具营养价值及促进口腔活动的优质食品。

胡萝卜:相当营养的新鲜胡萝卜榨成汁,每天和蜂蜜搭配饮用,不仅可以帮助瘦脸蛋,还能带来全身的轻盈改变。

西洋芹:富含高纤维质以及充沛的钾元素,还能促进口腔活动,是不可多得的小脸健康食物呢。

柿子干:可以当零食吃的柿子干,不仅不用担心会发胖,极好的咀嚼功效和超高的钾质让你越吃脸越小。

小脸明星私房FOOD

巴掌脸的台湾小脸美人丁小芹为了甩掉脸蛋的小肉肉,自制了几款超级瘦身的简易食物,不仅能够控制营养,还能保持脸形匀称和立体,一箭双雕哦!

蜂蜜胡萝卜汁

材料:胡萝卜半条,半杯水,一勺蜂蜜

胡萝卜切条放入果汁机,加入半杯水和蜂蜜,启动机器约1分半钟,胡萝卜汁和蜂蜜已经充分混合,既营养又可口。

苹果西洋芹沙拉

材料:苹果三个,西洋芹一把,沙拉酱

将新鲜的苹果和西洋芹洗净,切片之后用冰水冲,使其更具清脆口感,拌上沙拉酱,美味又健康。 这样美味又享"瘦"的方丽,坚持下去,大脸变小脸不再是问题。



TAG:瘦身不等于瘦脸 尤其不健康的瘦身方式 如节食或者过度依赖减肥药 都是破坏身体健康的元凶 不仅会让身体状况变差 还会间接影响脸色 使眼周出现小细纹 脸颊

win7激活的问题

win7激活的问题



win7激活成功后无法进入系统,原本是以为100M的保留分区分配了驱动器号的问题,在网上找了半天,除了用win7pe合成分区外发现没有什么办法了。

用Grub引导都会出现问题。win7系统盘修复启动项一直失败。

苦于网速不给力,pe下载不动。

无聊百度了下,win7激活失败怎么办。

结果发现 在系统盘的cmd命令行下输入:bootrec /fixboot 重启 可以正确引导win7系统。

虽然激活失败,但还是能进入系统了 +_+。

不知道有没有大神们有没有更好的办法??

转载请注明出处:http://www.cnblogs.com/vimous

TAG:

关于Hyper

关于Hyper



在Hyper-V R2下新建了一个虚拟机,装的是Win7 64位。想当然的用oem7F做处理,结果虚机重启直接黑屏了。

经过一翻网上查找结局方案,加上半天摸索,终于解决了。

方法如下:

1。确定System32目录下的VMWP.exe的版本。一般win 2008 R2下是6.1.7600.16385,win2008 R2 Sp1下是6.1.7601.17514。

    因为传说silv2.1的信息是写在这个exe里的。网上找到对应版本的exe替换即可。

2。启动虚拟机,用SLIC_Dump_TooKit.EXE工具检查虚拟机下的操作系统是否真的silc2.1了。

image

3。找到合适的证书,导入即可。例如

slmgr /ilc C:\install\Dell.xrm-ms

4。再导入一个合适的CD-KEY。就完成了。

 

参考文献

http://bbs.pcbeta.com/viewthread-838277-1-1.html

http://diybbs.zol.com.cn/1/34121_754.html



TAG:

适度的奢华 六天夜夜精彩 (6)

适度的奢华 六天夜夜精彩 (6)



  每晚如何光彩夺目地出席各种重要场合?怎么穿才是适度的奢华,如何穿才能成为全场的焦点?跟随为你贴身打造——从Monday to Saturday 由轻奢华到光彩夺目的奢华进阶课,让你夜夜精彩!

白色刺绣镂空衬衫Louis Vuitton
银白色铅笔裙Diane Von Furstenberg
白色荷叶边裙Emporio Armani
水晶项链、水晶戒指、耳环
Martine Wester
水晶手链
Loewe、Louis Vuitton、Céline
白色手包MCM  参加时尚晚宴
  奢华重点:闪光面料单品
  奢华指数:★★
  一件有光泽感质地的时装单品可以适度地增加服装的华丽感。



透明紫色亮片刺绣背心
Givenchy by Riccardo Tisci
紫色连身裤Max Mara
方形戒指0322
白色金色拼接手镯
Marina Rinaldi
透明手镯Louis Vuitton
手镯Hermès
水晶手链 Martine Wester
彩钻手镯 Inniu  应邀艺术画廊
  奢华重点:小面积亮片刺绣点缀
  奢华指数:★★
  闪烁的亮片刺绣让你更容易受到注目,同色系小面积的亮片点缀看上去既优雅又时髦。



白色镂空领Louis Vuitton
蓝色连身裙Yves Saint Laurent
灰色皮草 唐韵红绣
水蓝色腰带MCM
明黄色拎包Mulberry
水晶项链Martine Wester
方形金属木质拼接戒指0322
橙色手镯Hermès
水晶手镯Céline  赶赴VIP 私人聚会
  奢华重点:小面积皮草点缀
  奢华指数:★★★
  春天略寒的夜晚,小小的皮草披肩既温暖又能让你的着装奢华度恰到好处。




黑色短款复古外套Moschino
刺绣珠片套装Dolce & Gabbana
绿色花团项链Marni
绿色水晶项链Martine Wester
水晶耳环Prada
白色金色拼接手镯 Marina Rinaldi
绿色高跟鞋 Sergio Rossi
宝石刺绣手包 Dolce & Gabbana  出席时装秀场
  奢华重点:大面积重工宝石刺绣+ 奢华感配饰
  奢华指数:★★★★
  穿着一款宝石重工刺绣套装出现在聚光灯下,再加上有设计感的奢华配饰,让奢华感与设计感完美融合。



大亮片上衣Marc by Marc Jacobs
黄色短裙Fendi
方形金属戒指0322
绿色花团项链Marni
金色耳环 H&M  共度狂欢派对
  奢华重点:大面积亮片+ 夸张金属配饰
  奢华指数:★★★★★
  大面积的亮片在忽明忽暗的灯光下越发清晰可见,夸张设计的金属配饰既年轻又华丽。



黑色针织超长裙Chanel
灰色皮草 唐韵红绣
黑色手拿包Bulgari
黑色红底高跟鞋Céline
白色圆片耳环Marni
红色腰带MCM
戒指0322
水晶手链Loewe、Céline
黑色宽手镯Chanel
水晶装饰项链、水晶手链Martine Wester  观赏歌剧
  奢华重点:皮草+复古感奢华水晶配饰珠宝+晚礼超长裙
  奢华指数:★★★★★
  多件极具奢华感的单品组合在一起,十分轻易地将奢华感推向了极致。



TAG:奢华 场合

“不规则”上装解救缺陷臃肿体型,爱美网教你穿衣搭配塑造完美身材

"不规则"上装解救缺陷臃肿体型,爱美网教你穿衣搭配塑造完美身材



  

  

  不规则V领针织衫

  针织衫向来给人轻柔垂坠的感觉,所以称为大多数微胖mm的穿衣决选。而这件荷叶边不规则衣摆的针织衫不仅宽松的衣身可以改善身材,圆滑的荷叶边线条带来的垂坠感更是让肥胖赘肉去无踪。


  

  不规则T恤

  从上而下由窄到宽的设计可以将小肚腩收拾得服服帖帖,前后长度不一致的衣摆,稍长的后摆可以遮掩大pp,让缺陷身材瞬间消失,搭配超短裤休闲时尚。


  

  不规则翻领外套

  大翻领和褶皱领口合二为一,柔美的线条感彰显女性柔和的一面,还能最大程度掩饰小肚腩。内衬一件T恤都很百搭哦!


  

  不规则连帽拉链卫衣

  套头卫衣见得多了,这款假两件拉链卫衣可是少见。前摆两侧稍长,中间凹进去的设计新颖独特,宽松的版型很适合个头较大或是稍胖的妹纸哦!


  

  不规则衣摆皮衣

  皮衣向来给人帅气耍酷的一面,但是如果注入不规则元素便会让传统皮衣一改往日的样貌,这件下摆规则不一的皮衣设计感极强,融合了皮衣的硬朗亦不乏mm阴柔的特性。


  

  不规则衣摆T恤

  长短不一的前后摆采用了圆滑的荷叶边设计,不仅丰富了层次感,还能让肥嘟嘟的肚腩藏匿无踪。


  

  不规则翻领开衫

  开衫最适合这个气候穿了,而这件专门为OL设计的不规则翻领开衫最抢眼了,搭配紧身裤很秀身材的说。


  

  不规则大翻领拼接外套

  Pu皮与黑色棉布的拼接看起来很硬朗,让你穿出女性的干练。腰间处内凹的弧度设计圆润不突兀,搭配破洞牛仔裤,英伦风十足。

        爱美网猜你喜欢的文章:

        扬长避短穿衣魔法 搭出惹火好身材
        欧美潮人出色搭 独爱永恒黑色外套



TAG:显瘦搭配 穿衣搭配 服饰搭配 春装 不规则上装

1963年科尔维特中置引擎超跑 (3)

1963年科尔维特中置引擎超跑 (3)



通用是否要将旗下的Chevrolet Corvette变成中置引擎超跑,这个传闻一直还没烟消云散,不过至少即将到来的C7不会得到改变了。不过“前改中”的引擎布局对改装厂来说完全不是问题。现在有一部1963年的V7 Prototype(雏型为Corvette C2),经过大改之下不仅有了中置引擎后轮驱动传动布局,还有高达1000匹马力的动力。

这部车将出现在 4月5~7日于佛罗里达Palm Beach举办的2012 Barrett-Jackson Collector Car Auction(收藏车拍卖会)上。而这部车的外观也重新包装过,拥有了漂亮的流线型车身。

它的引擎是来自Chevrolet LS的双涡轮增压V8引擎,马力1000匹、扭力126.5kgm。而车室里面也经过一些改装,例如方向盘装了换挡拨片、赛车座椅、仪表总成,而悬吊、刹车系统也都经过改装。据车主自己的说法,这部车的0~96km/h加速的时间还不到三秒!


1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装


1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装1963年科尔维特一千马力中置引擎改装



TAG:科尔维特 通用 Chevrolet Corvette 中置引擎 超跑 改装 1963年 V7 Prototype Corvette C2

组图:心机透视 玩转春日小性感

组图:心机透视 玩转春日小性感



  户外阳光明媚,轻薄的衣衫也就迫不及待地要穿起来,Miranda Kerr、January Jones等明星就为我们示范了2012春夏季透视设计的新穿法。随意、性感又不失优雅态度,全然没有暧昧感。

  透视装不但讲究跟其他服饰的搭配,更重要的是与内衣的搭配。内衣的选择其实无非黑色、裸色或者白色,其他彩色或者花式的内衣还是留待性感歌手们在舞台上探索吧!

透而不视透而不视

  Amanda Seyfried 的裸色 Nina Ricci 纱裙乍一看几近透明,仔细看里面还有打底,遮挡的十分严实。但吸引人的程度丝毫不差,仙子般的轻逸呼之欲出。

以裸色衬裙打底以裸色衬裙打底

  Amanda Peet 也以裸色衬裙打底,把Lela Rose T台上性感的裙装穿出大家闺秀的味道。

黑色透视黑色透视

  Miranda Kerr 的街拍造型真是时髦得毫不费力,关键在于基本款中加入一两件点睛单品。

刺绣透视衫刺绣透视衫

  一件精致的刺绣透视衫就能把街拍造型提升至半正式活动装扮,January Jones 将性感与帅气平衡的恰到好处。

白色透视白色透视

  SJP 大胆的穿法可不是人人都能hold得住,一般女星可能会选择白色或者裸色的内衣来搭配这件 Louis Vuitton 的裙装,但黑色在此也毫不突兀。

透视的程度取决于里面的内衣透视的程度取决于里面的内衣

  透视的程度其实取决于里面的内衣,白衫里面搭黑色就会显得很透,搭白色或者裸色就只是轻薄,January Jones 这种隐隐约约的穿法真的会让人不禁多看几眼。



TAG:性感 搭配 裙装 组图:心机透视 玩转春日小性感

摩纳哥王妃挚爱的订婚珠宝 (6)

摩纳哥王妃挚爱的订婚珠宝 (6)



  1955年,梵克雅宝(Van Cleef & Arpels)为葛蕾丝·凯莉(Grace Kelly)嫁给摩纳哥王子量身定制了一套订婚珠宝,包括三圈项链、手镯、耳环及一枚指环。自此这套珠宝一直着伴随她,成为她的挚爱。
银幕女神葛蕾丝·凯莉 (Grace Kelly)
银幕女神葛蕾丝·凯莉(Grace Kelly)演活了她自己的童话——当她于1956年下嫁摩纳哥雷尼尔王子时,全球为之雀跃不已。



订婚项链  此前一年的1955年,摩纳哥公国已委托Van Cleef & Arpels梵克雅宝创作一套订婚珠宝,包括三圈项链、手镯、耳环及一枚指环。三个月后,品牌获颁“Official Supplier to the Principality of Monaco(摩纳哥公国指定供货商)”的荣誉头衔。整套珠宝由此成为葛蕾丝·凯莉王妃生活的一部分,伴随她走过无数官方场合和私人聚会,也真切传载了品牌和王妃之间的亲密关系。



订婚耳环



摩纳哥王妃葛蕾丝·凯莉于1976年  葛蕾丝·凯莉王妃多次于摩纳哥的Van Cleef & Arpels梵克雅宝精品店选购珠宝,包括一枚以钻石和蓝宝石镶嵌的花朵胸针、一串于1970年代设计的黄金糙面长项链、Alhambra项链、Roses de No?l胸针和耳环、一个Daisy百宝匣、一顶Swan头冠、珊瑚和钻石长项链及胸针套装。



订婚戒指




王妃当时佩戴的王冠  1978年,Van Cleef & Arpels梵克雅宝再次见证摩纳哥的王室婚盟。在女儿卡罗琳公主(Caroline) 与菲利普·贾纳 (Philip Jugnot) 的婚礼上,葛蕾丝?凯莉王妃戴上品牌设计的铂金镶嵌梨形、榄形及圆形钻石冠冕,重77.34克拉。



TAG:梵克雅宝 王妃 摩纳哥

名人限量版纪念腕表 收藏价值在哪,爱美网奢华教您如何赏鉴限量版名人纪念款腕表

名人限量版纪念腕表 收藏价值在哪,爱美网奢华教您如何赏鉴限量版名人纪念款腕表



mg/h007/h19/img201203281509331.jpg" target=_blank alt=" ">



 名人限量版纪念腕表的收藏价值在哪

          要找一枚货真价实的、某某名人用过的古董表,基本上和在潘家园"捡漏"一样几乎不可能。这里提及的是"名人纪念表",包括限量、非限量的量产表,亦包括产量公开、或产量未知的各大品牌推出的时计。它们的共通之处是,无论是外观设计、内在工艺,抑或表款的起源均与历史上的名人紧密相关。

 名人限量版纪念腕表的收藏价值在哪


        非古董

        要找一枚货真价实的、某某名人用过的古董表,基本上和在潘家园"捡漏"一样几乎不可能。这里提及的是"名人纪念表",包括限量、非限量的量产表,亦包括产量公开、或产量未知的各大品牌推出的时计。它们的共通之处是,无论是外观设计、内在工艺,抑或表款的起源均与历史上的名人紧密相关。




 名人限量版纪念腕表的收藏价值在哪



        独特材质或精心挑选的材质

        对"名人纪念表"而言,贵金属材质的外壳和一条真正的鳄鱼皮表带也是诚意的最佳表现。


 名人限量版纪念腕表的收藏价值在哪


        限量版中的产量

  站在"产量"的维度上,名人纪念表与其它腕表同理。独一无二胜过限量,产量愈稀少愈珍贵。据我所知,非限量的名人纪念表在中国最常见,包括在北京各大旅游景点为游客们喜闻乐见的毛主席纪念腕表,中山陵的孙中山纪念腕表。,当然也有为明星们粉丝特别制造的只为追星心理而设的低价值纪念表。


 名人限量版纪念腕表的收藏价值在哪

        品牌当中的营销策略

  得看得懂品牌推出"名人纪念表"是玩票、圈钱、摆噱头还是搏宣传。万宝龙(Montblanc)在十几年前推出海明威限量版墨水笔的时,基本上让全球的笔迷为之倾倒,而这些年来,各种品牌各种产品的限量版其实已经令人有些审美疲劳了。这种策略几乎成了品牌宣传的重要事项,只要依托名人出过一个限量版的珠宝或者腕表,至少可以拼接名人效应作一年的宣传大片。


 

 名人限量版纪念腕表的收藏价值在哪


        纪念版名人表承载着精神

  任何一枚完美的名人纪念表,都应该是一句最鼓舞人心的励志话语。每次抬起手腕,我们知晓了准确的时间之余,会发现梦想的那种生活其实一直就在我们手中,更准确地说,是被表带结实地绑在了手腕上!


         名人纪念版腕表例子:

 名人限量版纪念腕表的收藏价值在哪


        1.王公贵族

  欧米茄(OMEGA)——沙特阿拉伯国王伊本沙特,这是欧米茄于 50 年代末为沙特阿拉伯国王伊本沙特所专门制造的中置秒针防水18K玫瑰金男士腕表。表盘上内圈 12 角形的装饰显示出早期星座系列腕表的峥嵘面貌,靠近 12 时位置则为沙特阿拉伯国王伊本沙特身穿阿拉伯传统服饰的头像。

 名人限量版纪念腕表的收藏价值在哪

         尽管现代的王公贵族们已经失去了这份以自己的形象来塑造时计的闲情,但是在世界历史上留存有显赫位置的政要人物,仍不失为品牌推出纪念款时计的灵感来源。





    

 名人限量版纪念腕表的收藏价值在哪    

        万宝龙(Montblanc)特别推出摩纳哥格蕾丝王妃系列

 名人限量版纪念腕表的收藏价值在哪

       王公贵族
     
       
为向摩纳哥已故的格蕾丝王妃(Princess  Grace)致敬,万宝龙(Montblanc)特别推出摩纳哥格蕾丝王妃系列(Collection Princesse Grace de  Monaco),并于9月8日在摩纳哥举行了首发仪式。珠宝首饰以及书写工具当中就包括腕表。



 名人限量版纪念腕表的收藏价值在哪

        2.音乐家

  豪力时(Oris)——Bob Dylan 在很多人年少怅惘的日子里, Bob Dylan是不可替代的精神偶像。 豪力时向这位吟游歌者致敬而推出了一款方形腕表。精钢表壳上的黑色花纹表盘令腕表的视觉效果充满特点,近6时位置的日期窗口上方印刻着Bob Dylan的亲笔签名,表背则是他的头像以及圆形透明窗口,令佩戴者可以欣赏到内部的机芯构造。这款限量3000枚的时计的另一个亮点是,随表附送一只 Hohner Marine。



 名人限量版纪念腕表的收藏价值在哪



 名人限量版纪念腕表的收藏价值在哪

        3.演员

  汉米尔顿(Hamilton)——Ventura ELVis 腕表猫王纪念版 向传奇人物致敬 汉米尔顿品牌于1892年成立于美国宾夕法尼亚州兰开斯特市,是世界上最大的钟表制造商和经销商Swatch集团的成员,汉米尔顿凭其创造的精密典雅的钟表而声誉卓著,并成为世界上处于领导地位的手表品牌之一。

  爱美网猜你喜欢的文章:

  幻想童趣 爱马仕手绘童趣手拿包系列
  明星云集香奈儿东京影展开幕仪式



TAG:手表腕表 万宝龙 Montblanc 欧米茄 OMEGA 奢侈品 限量版腕表 名表

夏日首选发型 个性修颜及肩短发,爱美网美发分享中长发发型设计图片

夏日首选发型 个性修颜及肩短发,爱美网美发分享中长发发型设计图片



  

 夏日首选发型 个性修颜及肩短发

  柔美娇滴滴的感觉是打造日系发型的惯用元素,发丝蓬松的凌乱感颇有日系范了,我见犹怜的感觉惹人疼爱。

  

 夏日首选发型 个性修颜及肩短发

  心机打造发尾往外翘效果增添发型的俏丽美,淑女MM们这款无疑就是你寻觅已久的另一个自己吧。 


 夏日首选发型 个性修颜及肩短发

  蓬松的蛋卷头短发恰到是好,发尾的感觉是轻盈的漂浮在空中加上侧分的刘海更显格外灵动美丽。 


 夏日首选发型 个性修颜及肩短发

  偏淡红的发色更令这款短发魅力指数飙升,与此同时另你光彩照人还极具韩系风格。 


 夏日首选发型 个性修颜及肩短发

  中分的刘海突显了麻豆漂亮的鹅蛋脸,适合额头长得漂亮的MM哦,利落的及肩短发散发麻豆开朗活泼的个性。  


 夏日首选发型 个性修颜及肩短发

  栗色的及肩短发提升了发型的时尚度,使得原本缺乏生气的发型鲜活靓丽,发尾的外翘打造更显俏丽美。 


 夏日首选发型 个性修颜及肩短发

  柔顺的发丝+顺滑的斜刘海打造甜美的青春少女形象,让你仿若又回到了那个青葱岁月的年华。 


 夏日首选发型 个性修颜及肩短发

  染上一款中意的发色瞬间完美蜕变,抢眼卖萌两不误。

  爱美网美发猜你喜欢的文章:

        2012最Hit及肩卷发 轻熟魅力升温
       人气韩式女大学生及肩发型 清新无敌



TAG:中长发 烫发 卷发 女生发型 春夏发型 夏季发型