精华内容
下载资源
问答
  • Winform架构

    2011-07-14 09:14:00
    最近在网上经常看到关于Winform架构的文章,但是很多都是以B/S结构的标准三层架构为例子。个人认为,这种架构不适合业务逻辑比较复杂的软件,每张表建一个所对应的实体对象,那么在业务比较复杂的时候,join多张表的...

    最近在网上经常看到关于Winform架构的文章,但是很多都是以B/S结构的标准三层架构为例子。个人认为,这种架构不适合业务逻辑比较复杂的软件,每张表建一个所对应的实体对象,那么在业务比较复杂的时候,join多张表的时候该怎么办?记得在四月份面试了一位程序员,他以前开发过一个软件,架构就是采用此架构。还跟我说,此架构速度会快一点。想想搞笑,这样的架构怎么速度快一点,我只觉得此架构的好处是比较适合多人开发,而且代码维护比较好。但我始终不认为,winform采用这样的架构。很多人不喜欢DataSet,说什么Dataset是会造成并发。其实MSDN中有这样一句话: 设计DataSet对象的目的是为了促进将开放式并发用于长时间运行的活动,例如对数据进行远程处理以及与数据进行交互时。ADO.Net中的原理在这里不再多讲。从物理分层(客户端,中间层,数据库)角度来讲,这种架构如何进行物理方面的分层,也许我孤陋寡闻。但是我看到过,客户端用.net或delphi等写,中间层用JBOSS、WebLogic等。但具体怎么会层,我不清楚。希望写此篇文章抛砖引玉,来讨论这方面的技术问题。

    转载于:https://www.cnblogs.com/Anders888/archive/2011/07/14/2105933.html

    展开全文
  • WCF实现Linq+Winform架构数据库开发Demo

    热门讨论 2015-01-13 17:09:27
    实体层采用linq to sql,客户端winform实现增删查功能,服务端用WCF框架,适用于WCF学习数据库开发。 有问题可以留言 http://blog.csdn.net/quan278905570
  • 先看一下项目整体分层架构 Entity实体层。这里使用Linq To Sql来实现。数据库比较简单只放了一张TB_GuestBook表 需要注意的是为了支持WCF,要右击空白处设置序列化模式为单向。 表中添加了一个timestamp...

     

    
    
    
    

     

    点击下载Demo源码

    先看一下项目整体分层架构

     

     

    1. Entity实体层。这里使用Linq To Sql来实现。数据库比较简单只放了一张TB_GuestBook表

     

     

    需要注意的是为了支持WCF,要右击空白处设置序列化模式为单向。

     

    表中添加了一个timestamp时间戳类型,在直接使用Linq自动生成sql功能进行update操作时,需要有一个时间戳字段,或是在linq设计页面选择表的一个字段设置为时间戳。才能正常update到数据库中。如果是调用自定义的存储过程就可以省略这步。

     

    2.契约层,即服务向客户端提供的接口。

     

    namespace Contract
    {
        [ServiceContract]
        public interface IGuestBook
        {
            /// <summary>
            /// 新增信息
            /// </summary>
            /// <param name="tb">信息体</param>
            /// <returns>执行结果</returns>
            [OperationContract]        
            bool Add(TB_GuestBook tb);
    
            /// <summary>
            /// 删除信息
            /// </summary>
            /// <param name="tb"></param>
            /// <returns></returns>
            [OperationContract]
            bool Delete(int id);
    
            /// <summary>
            /// 修改信息
            /// </summary>
            /// <param name="tb"></param>
            /// <returns></returns>
            [OperationContract]
            bool Update(TB_GuestBook tb);
    
            /// <summary>
            /// 获取列表
            /// </summary>
            /// <returns></returns>
            [OperationContract]
            List<TB_GuestBook> GetList();
        }
    }

     

    3. WCF服务实现层。主要实现对应接口的方法。

    namespace WcfService
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“GuestBook”。
        [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
        public class GuestBook : IGuestBook
        {
            GuestBookDataContext dc;
            public GuestBook()
            {
                dc = new GuestBookDataContext();
            }
    
            public bool Add(TB_GuestBook tb)
            {
                try
                {
                    dc.TB_GuestBook.InsertOnSubmit(tb);
                    dc.SubmitChanges();
                }
                catch (Exception)
                {
                    return false;
                    throw;
                }
                return true;
            }
    
            public bool Delete(int id)
            {
                try
                {
                    TB_GuestBook tb = dc.TB_GuestBook.SingleOrDefault(e => e.ID == id);
                    dc.TB_GuestBook.DeleteOnSubmit(tb);
                    dc.SubmitChanges();
                }
                catch (Exception)
                {
                    return false;
                    throw;
                }
                return true;
            }
    
            public bool Update(TB_GuestBook tb)
            {
                try
                {
                    dc.TB_GuestBook.Attach(tb, true);
                    dc.SubmitChanges();
                }
                catch (Exception)
                {
                    return false;
                    throw;
                }
                return true;
            }
    
    
            public List<TB_GuestBook> GetList()
            {
                try
                {
                    return dc.TB_GuestBook.ToList();
                }
                catch (Exception)
                {
                    return null;
                    throw;
                }
            }
        }
    }
    
    
    

    4.部署服务到IIS。服务实现层编译完成后,在IIS中添加虚拟目录(或网站),目录位置为服务层所在文件夹。

    在IIS中右击GuestBook.svc->浏览.可看到页面显示说明可以客户端正常调用服务了。

     

     

    5.Winform客户端

     

    右击Service References,添加服务引用

     

    引用地址为IIS中浏览的页面地址

     

    在此处可以看到WCF提供的几个方法。重命名空间名GuestBookService,确定后可看到服务已经添加到客户端。

     

     

    控件数据绑定:

    添加一个DataGridView,DataSource的属性点击下拉按钮,在“其他数据源”下可以找到服务提供的数据源TB_GuestBook,选中它。

     

    选完后系统会生成一个tbGuestBookBindingSource的数据源。将几个文本框的Text属性都绑定到该数据源下的对应字段上。

    比如ID文本框的设置如下:

     

    控件都绑定完成后,就可以写功能代码了。

    1.加载数据:先声明一个服务代理变量GuestBookClient dc ;

    加载数据方法调用WCF服务代理的getList方法,直接赋值给BindingSource

     

            private void LoadData()
            {
                tbGuestBookBindingSource.DataSource = dc.GetList();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                LoadData();
            }

    删除按钮:

            private void btnDel_Click(object sender, EventArgs e)
            {
                TB_GuestBook tb = tbGuestBookBindingSource.Current as TB_GuestBook;
                if (tb != null)
                {
                    if (dc.Delete(tb.ID))
                    {
                        LoadData();
                        MessageBox.Show("删除成功.");
                    }
                    else
                        MessageBox.Show("删除失败.");
                }
                else
                {
                    MessageBox.Show("选择的对象为空");
                }
            }

    保存按钮:

            private void btnSave_Click(object sender, EventArgs e)
            {
                TB_GuestBook tb = tbGuestBookBindingSource.Current as TB_GuestBook;  
                
                if (dc.Update(tb))
                {
                    LoadData();
                    MessageBox.Show("更新成功.");
                }
                else
                    MessageBox.Show("更新失败.");
            }

     

     

     

     

     

     

     

    展开全文
  • 通过上面对模块加载和WinForm架构设计的讨论,总结一下: 吉日文中说的这种应用反射的情况并不是因为基于启动效率的问题,而是设计的考量。这个地方跟性能一点关系都没有(在这里对我在老赵博客里开始错误的评论表示...

    这两天园子里最火的莫过于吉日的白话反射,导致包子的批判,然后引来了老赵的两篇文章,然后又有若干人等一堆反射技术文章出世。可谓百花齐放,百家争鸣啊。喜欢这种氛围,呵呵。

    今天我不谈反射,但和反射有关

    不谈吉日,但话题是从这里开始

    吉日的《白话反射》里说到:

    "我们在开发大型软件项目时经常会遇到,系统很庞大了有几百M的代码了,主程序启动时,总不能把这些都引用了吧?全部加载在内存里?那程序的启动速度,不知道会不会慢如老牛推车了?这时候也会用一些反射技术等,用到哪个窗体,就动态加载哪个那个窗体,总感觉比较清爽一些。"

    表面一看,确实。主模块引用这么多模块,启动的时候那不是很慢,那必须用反射来“制造”一个延迟加载的机制。

    实际上,CLR的加载过程是什么样子的呢?(不说的那么详细)

    很多书里都介绍了,JIT的编译单元是方法。当执行一个方法之前,会先JIT(即时编译)这个方法,然后发现,这个方法里引用了在别的程序集里定义的类型,那么CLR Loader就会加载这个程序集(更详细的过程可以参见《.Net本质论》或我之前的两篇文章CLR LoaderAssembly Loader)。那这么看来,吉日说的就是错误的,几百M的代码不错,难道这几百M的代码在启动的时候就会全部执行么?如果不执行也就不会JIT,不会JIT也就不会加载这些模块。但是有一个例外:你这几百M代码,全部放在一个模块里(我觉得吉日肯定不会那么干)。

    根据上面的讨论,所以吉日说的这种场景不需要用反射,不会影响主程序的启动速度,只需要合理的划分子功能模块就可以了,不要弄得铁板一块。

    真的是这样的么?如果光说教我会很快的陷入太虚之中,所以我准备了一个小实验:

    image

    这个一个典型的WinForm应用的解决方案。Main是主启动项目,而FunctionModule1-FunctionModule4是具体的子功能模块(实际的项目中,肯定不止四个)。

    我们看到这里Main项目中引用了四个子功能模块。然后下面是主界面:

    image

    Function主菜单下有四个子菜单,每个子菜单调用一个子功能模块,菜单的事件代码如下:

       1: private void function1ToolStripMenuItem_Click(object sender, EventArgs e)
       2: {
       3:     Function1 function = new Function1();
       4:     MessageBox.Show(function.ToString());
       5: }
       6: private void function2ToolStripMenuItem_Click(object sender, EventArgs e)
       7: {
       8:     Function2 function = new Function2();
       9:     MessageBox.Show(function.ToString());
      10: }
      11: private void function3ToolStripMenuItem_Click(object sender, EventArgs e)
      12: {
      13:     Function3 function = new Function3();
      14:     MessageBox.Show(function.ToString());
      15: }
      16: private void function4ToolStripMenuItem_Click(object sender, EventArgs e)
      17: {
      18:     Function4 function = new Function4();
      19:     MessageBox.Show(function.ToString());
      20: }

    现在问:这里的Main项目启动时,会主动加载这四个子功能模块么?

    我们使用Visual Studio调试时输出窗口的功能看看:

    image

    窗口中,前部分输出的是加载的框架的模块,最后一个是加载Main程序集。但是FunctionModule1-FunctionModule4呢?我仔仔细细寻找了好几遍没发现。那么说明,Main项目启动时,不会主动加载子功能模块的,所以吉日的说法是错误的,除非他把所有子功能模块全部写在主功能模块中。那什么时候加载这些子功能模块?来,我们尝试点一下菜单:

    image

    子菜单的功能弹出来了,从输出窗口里也发现这个时候加载了FunctionModule1.dll。

    以下是对WinForm应用架构设计的讨论

    -----------------------------------------------------------------------------------------------------------

    下面,我们来讨论一下WinForm应用的架构问题。

    我不知道园子里有多少人在做.Net WinForm应用,只是看到园子里大部分人都是在搞Web或WPF。苦恼的我还在搞WinForm,不过也其乐无穷。

    上面的实例实际上也给出了大部分WinFrom项目的一个雏形,很多的菜单,每个菜单对应一个功能,打开一个功能的时候要么是Mdi的模式,弹出一个窗口,要么就是一个TabPage。大的工程肯定是一个人完成不了的,需要多个人来做这个事情。但是又需要统一规划。

    所以必定是这样的:由架构师来规划好底层支撑的框架,比如这里的Shell,还有一些引擎级别的服务(比如LanguageService“多语言”,PropertyService“持久化软件里某些设置”等)。这个框架必须稳定,项目组其他人员,每个人负责一个或多个功能,每个人只需要关注自己的业务就可以了,把功能做好,然后调用框架里提供的一些服务,把自己给挂接到主框架中。

    那么如果按照上面示例的这种设计,我们的程序主框架就必须引用所有的子功能模块,项目开始的时候,可能只有一两个模块,随着项目的前进,引用也在不断的增加,而主界面上的菜单也在不断的增加,这可以说主界面是稳定的么?

    那我们必须寻找一种机制。子功能对自己负责,子功能负责自己将自己注册到系统中去。这个时候我们可能采用这样的方式:

    一个Modules文件夹,在这个文件夹下又放着很多子文件夹,每个子文件夹里放着一个功能,当系统启动的时候,由框架搜寻Modules子文件夹,在里面查找一个后缀名为addin(或者其他方式)的xml文件,文件里面的内容可能如下:

    <MenuItem Site=”File” Text=”Edit” Icon=”Edit.png” CommandType=”MultiLibrariesApp.EditCommand” />

    主模块读取这个之后就会生成一个菜单项,当点击这个菜单项的时候,根据CommandType,利用反射实例化一个EditCommand类型,所有的Command可能都实现一个ICommand接口,而这个接口里有一个Run方法:

       1: public interface ICommand
       2: {
       3:     void Run();
       4: }
       5:  
       6: public class EditCommand : ICommand
       7: {
       8:     public void Run()
       9:     {
      10:         //code here...
      11:     }
      12: }
      13: public class MenuItem
      14: {
      15:     public string Text{get;set;}
      16:     //主框架的代码里
      17:     ICommand command = null;
      18:     private void MenuItem_Click(object sender, EventArgs e)
      19:     {
      20:             //延迟加载
      21:             if(command == null)
      22:                 command = //通过反射实例化具体的Command类型,这里就是EditCommand
      23:            command.Run();
      24:     }
      25:     public ToolStripMenuItem CreateMenu()
      26:     {
      27:         ToolStripMenuItem menuItem = new ToolStripMenuItem();
      28:         menuItem.Text = this.Text;
      29:         menuItem.Click += MenuItem_Click;
      30:     }
      31: }

    这样,就能保证主框架是稳定的了,子功能负责自己的菜单管理,只需要写一个文件就可以了。

    当然,实际的框架实现过程中,肯定会碰到各种各样的问题,这只是一个思路。对于WinForm程序而言,你还可以参考一下开源项目:

    SharpDevelop 一个开源的IDE

    MonoDevelop 从SharpDevelop发展而来,但是现在大变样了

    Mono.AddIn由MonoDevelop的插件机制发展出来的一个小插件系统

    Composite Application Block 微软模式&实践小组的

    还有很多其他,我就没有研究过了。

    以上只是我的一个思路,由于WinForm开发的看到不多,我在网上搜WinForm Best Practice也没找到多少资料,所以希望能够在这方面有所讨论。也许能碰撞出一些火花出来。

    后话

    刚才出去了一趟,在路上又思考了一些问题。

    通过上面对模块加载和WinForm架构设计的讨论,总结一下:吉日文中说的这种应用反射的情况并不是因为基于启动效率的问题,而是设计的考量。这个地方跟性能一点关系都没有(在这里对我在老赵博客里开始错误的评论表示道歉),用不用反射启动效率都是这样。

    再看看吉日另外一个应用反射的场景:两个类循环引用。我不知道为什么有这样一个设计,如果是遗留代码那你首先应该考虑重构一下,如果实在不能重构,就必须这样,那只有用反射了。所以这个问题也是设计上的问题,跟反射也没啥关系。

    还有吉日说的,配置多数据库的场景。老赵说了,这里推崇ORM。即使你不用ORM,我也觉得这是没有必要的。我不知道有多少情况一个正在运行的系统要突然更换不同类型的数据库?即使有这种情况,那么这也属于重大变更,对于这种变更,你完全可以修改代码。还有,针对这种情况,微软已经给出了Best Practice:提供者模式。虽然提供者模式最终还是反射。

    展开全文
  • winform三层架构

    2018-08-25 12:00:26
    winform 三层架构
  • winform多层架构实例

    2019-04-21 15:46:28
    多层架构学习时使用最佳,建议认真阅读实现过程,内附数据库
  • 内容索引:C#源码,数据库应用,WinForm,DataAccess 在这个实例中, 2005 + Access环境来实现,考虑到数据库的可移槙性,数据访问层使用了工厂模式, 的反射在运行时根据配置文件来动态决定采用何种数据库。
  • winform 三层架构

    热门讨论 2011-12-26 10:01:26
    winform 开发必学的三层架构,增删改功能,C#源代码,真的很不错哟!!!使用了sqlserver数据库的开发,
  • C# Winform三层架构代码

    2014-04-15 10:43:30
    C# Winform三层架构
  • WinForm三层架构示例

    2013-07-25 17:54:02
    一个winform三层架构的例子,采用工厂设计模式,分层清晰,适合学习三层架构的同学观摩。
  • winform下层架构实现

    2008-05-06 09:02:29
    一些觉得不错的代码 值得看看,应该对你有帮助
  • C# Winform 客户端架构 调用 REST 传输 Json

    【架构】

    1. 定义 GET、POST、PUT、DELETE,标准REST基础。

    2. 为了兼容多终端,日期、时间格式统一为Int,定义时间转换工具类。(Java 与 C# getTime起算日不同,Java为1970年起)

    3. Http图片,加载到内存,显示。工具类。

    4. 反射 根据实体类动态生成 DataGridView 数据,提供复用性,减少程序员工作。


    【JAVA服务端代码跳转】点击打开链接


    【效果】以此图效果为案例,描述架构过程


    【DataGridView 数据动态生成】

    1. 获取搜索条件,组装URL

    2. HttpClientUtil作为REST客户端,调用GET方法,返回JSON字符串

    3. JSON字符串,根据泛型,转换成实体

    4. 根据实体,反射遍历实体所有属性,动态生成DataTable

    5. DataGridView 绑定 dataTable

    private void listDataGridView()
            {
                string naturalId = this.txtNaturalId.Text;
                string barcode = this.txtBarcode.Text;
                string url = "/stocks/commoditystocks/" + "inPage/?pageNumber=1&pageSize=10&orderBy=&filter=naturalId_S_" + naturalId + "_LIKE__,barcode_S_" + barcode + "_LIKE__,qty_I_0_GT__&";
                List<CommodityStocks> commodityStockList = HttpClientUtil.doGetMethodToObj<List<CommodityStocks>>(url);
                DataTable dataTable = HttpClientUtil.toDataTable(commodityStockList);
                this.dataGridView1.DataSource = dataTable;
            }


    【HttpClientUtil 核心】

    1. 定义 GET、POST、PUT、DELETE,标准REST基础

    2. 定义 Json 序列化,反序列化 私有方法

    3. 定义 根据实体,反射遍历实体所有属性,动态生成DataTable

    namespace WindowsFormsApplication1.xiazhi.common
    {
        public class HttpClientUtil
        {
    
            private static string xiazhi_tomcat_url = Properties.Settings.Default.xiazhi_server_url;
            private static string xiazhi_server_url = xiazhi_tomcat_url + "resteasy";
    
            // REST @GET 方法,根据泛型自动转换成实体,支持List<T>
            public static T doGetMethodToObj<T>(string metodUrl)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(xiazhi_server_url + metodUrl);
                request.Method = "get";
                request.ContentType = "application/json;charset=UTF-8";
                HttpWebResponse response = null;
                try
                {
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (WebException e)
                {
                    response = (HttpWebResponse)e.Response;
                    MessageBox.Show(e.Message + " - " + getRestErrorMessage(response));
                    return default(T);
                }
                string json = getResponseString(response);
                return JsonConvert.DeserializeObject<T>(json);
            }
    
            // 将 HttpWebResponse 返回结果转换成 string
            private static string getResponseString(HttpWebResponse response)
            {
                string json = null;
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8")))
                {
                    json = reader.ReadToEnd();
                }
                return json;
            }
    
            // 获取异常信息
            private static string getRestErrorMessage(HttpWebResponse errorResponse)
            {
                string errorhtml = getResponseString(errorResponse);
                string errorkey = "spi.UnhandledException:";
                errorhtml = errorhtml.Substring(errorhtml.IndexOf(errorkey) + errorkey.Length);
                errorhtml = errorhtml.Substring(0, errorhtml.IndexOf("\n"));
                return errorhtml;
            }
    
            // REST @POST 方法
            public static T doPostMethodToObj<T>(string metodUrl, string jsonBody)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(xiazhi_server_url + metodUrl);
                request.Method = "post";
                request.ContentType = "application/json;charset=UTF-8";
                var stream = request.GetRequestStream();
                using (var writer = new StreamWriter(stream))
                {
                    writer.Write(jsonBody);
                    writer.Flush();
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                string json = getResponseString(response);
                return JsonConvert.DeserializeObject<T>(json);
            }
    
            // REST @PUT 方法
            public static string doPutMethod(string metodUrl)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(xiazhi_server_url + metodUrl);
                request.Method = "put";
                request.ContentType = "application/json;charset=UTF-8";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8")))
                {
                    return reader.ReadToEnd();
                }
            }
    
            // REST @PUT 方法,带发送内容主体
            public static T doPutMethodToObj<T>(string metodUrl, string jsonBody)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(xiazhi_server_url + metodUrl);
                request.Method = "put";
                request.ContentType = "application/json;charset=UTF-8";
                var stream = request.GetRequestStream();
                using (var writer = new StreamWriter(stream))
                {
                    writer.Write(jsonBody);
                    writer.Flush();
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                string json = getResponseString(response);
                return JsonConvert.DeserializeObject<T>(json);
            }
    
            // REST @DELETE 方法
            public static bool doDeleteMethod(string metodUrl)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(xiazhi_server_url + metodUrl);
                request.Method = "delete";
                request.ContentType = "application/json;charset=UTF-8";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8")))
                {
                    string responseString = reader.ReadToEnd();
                    if (responseString.Equals("1"))
                    {
                        return true;
                    }
                    return false;
                }
            }
    
            //根据实体,反射遍历实体所有属性,动态生成DataTable
            public static DataTable toDataTable(IList list)
            {
                DataTable result = new DataTable();
                if (list.Count > 0)
                {
                    FieldInfo[] fieldInfos = list[0].GetType().GetFields();
                    foreach (FieldInfo fi in fieldInfos)
                    {
                        if (fi.Name.Length > 4 && fi.Name.LastIndexOf("Date") == fi.Name.Length - 4)
                        {
                            result.Columns.Add(fi.Name, "".GetType());
                            continue;
                        }
                        if (fi.Name.Length > 4 && fi.Name.LastIndexOf("Time") == fi.Name.Length - 4)
                        {
                            result.Columns.Add(fi.Name, "".GetType());
                            continue;
                        }
                        if (fi.Name.IndexOf("imagepath") >= 0)
                        {
                            result.Columns.Add(fi.Name, Image.FromFile("1.jpg").GetType());
                            continue;
                        }
                        result.Columns.Add(fi.Name, fi.FieldType);
                    }
    
                    for (int i = 0; i < list.Count; i++)
                    {
                        ArrayList tempList = new ArrayList();
                        foreach (FieldInfo fi in fieldInfos)
                        {
                            object obj = fi.GetValue(list[i]);
                            if (null == obj)
                            {
                                tempList.Add(obj);
                                continue;
                            }
                            if (fi.Name.Length > 4 && fi.Name.LastIndexOf("Date") == fi.Name.Length - 4)
                            {
                                int dateInt = (int)obj;
                                if (0 == dateInt)
                                {
                                    tempList.Add("");
                                    continue;
                                }
                                obj = DateTimeUtil.convertIntDatetime(dateInt).ToShortDateString();
                            }
                            if (fi.Name.Length > 4 && fi.Name.LastIndexOf("Time") == fi.Name.Length - 4)
                            {
                                int dateInt = int.Parse(obj.ToString());
                                if (0 == dateInt)
                                {
                                    tempList.Add("");
                                    continue;
                                }
                                obj = DateTimeUtil.convertIntDatetime(dateInt).ToString();
                            }
                            if (fi.Name.IndexOf("imagepath") >= 0)
                            {
                                if (null == obj)
                                {
                                    tempList.Add("");
                                    continue;
                                }
                                WebClient myWebClient = new WebClient();
                                MemoryStream ms = new MemoryStream(myWebClient.DownloadData(xiazhi_tomcat_url + obj.ToString()));
                                obj = Image.FromStream(ms);
                            }
                            tempList.Add(obj);
                        }
                        object[] array = tempList.ToArray();
                        result.LoadDataRow(array, true);
                    }
                }
                return result;
            }
    
        }
    }


    【Java -- C# 时间转换】

    namespace WindowsFormsApplication1.xiazhi.common.util
    {
        public class DateTimeUtil
        {
            public static int convertDateTimeInt(DateTime time)
            {
                int intResult = 0;
                DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
                intResult = int.Parse((time - startTime).TotalSeconds.ToString().Substring(0, 10));
                return intResult;
            }
    
            public static DateTime convertIntDatetime(int utc)
            {
                DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
                startTime = startTime.AddSeconds(utc);
                return startTime;
            }
    
            public static DateTime getMonthFirstDay()
            {
                int year = DateTime.Now.Year;
                int month = DateTime.Now.Month;
                DateTime firstDayOfThisMonth = new DateTime(year, month, 1);
                return firstDayOfThisMonth;
            }
        }
    }




    展开全文
  • WINFORM三层架构

    2013-04-04 13:44:21
    使用了三层架购技术,初学者可以参考一下。
  • 详细手把手教你如何搭建C# WinForm三层架构
  • 三层架构winForm程序

    2015-01-06 20:11:47
    DotNetBar做的三层架构winForm程序,采用vs2005开发平台,是初学者的极品demo,希望大家一起进步,开拓代码的时代
  • WinForm三层架构学习

    2016-04-22 22:25:00
    WinForm三层架构学习 1. 按照层次建立命名空间:  a) 实体层:*.Model。  b) 数据访问层:*.DAL(Data Access Layer)。数据访问层将调用实体层和公共工具类。  c) 业务逻辑层:*.BLL(Bussiness ...
  • 基于WinForm的MVC2架构

    2013-06-07 12:50:05
    基于WinForm的MVC2架构,一般所见的都是Asp.net MVC2 Web结构的,此例是WinForm窗体结构下的MVC2应用,能正常运行调试。
  • Winform实现的组织架构图 C#组织架构图 由于工作需要并借鉴了一些程序,实现了一款组织架构图,效果如图,每个节点都是可以点击的,输入数据为DataTable ...
  • 在web开发中常常用到工厂模式三层架构,现在也在Winform中应用这种架构方式,尝试了很多,也模仿了经典例子PetShop,但是还是不行,也参 考了网上的一些例子。现在把我这个例子的整个制作过程简单的介绍一下。...
  • 这个例子是C#winform三层架构的例子,代码包括Model、DAL、BLL、UI,数据库为sqlserver2008,数据文件包含在工程中的data目录。
  • winform三层架构之登录

    2018-11-28 22:56:51
    在项目开发的过程中,有时把整个项目分为三层架构,其中包括:表示层(UI)、业务逻辑层(BLL)和数据访  问层(DAL)。三层的作用分别如下:    表示层: 为用户提供交互操作界面,这一点不论是对于Web还是WinForm都...
  • C# Winform抽象工厂架构

    2009-10-07 14:55:49
    实现抽象工厂多层架构,用到反射机制,实现报表查询,本资源是我的一个机试题,可以现套现用
  • winform的三层架构C#

    2008-09-17 09:43:10
    一个介绍三层架构winform的程序,对于了解三层架构有一定的帮助。
  • Winform 三层架构 SQLServer
  • C# winform 三层架构设计登陆小模块演示,初学者可以借鉴借鉴。没有放数据库,自己可以自行创建。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,001
精华内容 400
关键字:

winform架构