一起谈.NET技术,C#编程笔记(一)

简介: 前段时间,帮朋友用C#做了一个小玩意儿,在开发过程中,发现很多用的着的东西,在网上都没有很好的解决方案,前前后后折腾了近一个月,总算是基本上完成了,在此整理下,权作以后再用到时复习之用。      这个东西有点像星座性格测试那种的,只不过是要C/S的,安装到客户端上,所以做起来限制比较多。

      前段时间,帮朋友用C#做了一个小玩意儿,在开发过程中,发现很多用的着的东西,在网上都没有很好的解决方案,前前后后折腾了近一个月,总算是基本上完成了,在此整理下,权作以后再用到时复习之用。

      这个东西有点像星座性格测试那种的,只不过是要C/S的,安装到客户端上,所以做起来限制比较多。首先要有数据录入的功能,提供界面,用户要能向其中录入数据,比如星座测试一条一条的题目;然后要对每个题目,提出相应的反馈、建议;最后,录入完成了,用户还要能够有个界面对指定的数据库进行增删改查:前面是录入的功能。在用户性格测试的时候,要有窗口完成答题,并在提交后,查看测试的结果,有打分,有整体评价,并且对于那些答得不合适的,还有一些建议。

      接下来,我会按不同的模块,说一说我是怎么做的。

      (1)数据的存储

      由于没有数据库管理系统的支持,我选择XML来保存数据。所以,这一模块就是基本的XML的创建、添加、删除。

      (1.1)XML文件的新建

      我做的这个玩意儿,用的XML的数据格式比较固定,所以,新建XML文件的时候,大的结构就写死了,不希望,也不会发生改变:

EmptyXmlDocumentCreate
 1                   this ._fileName  =  fileName;
 2                   this ._xDoc  =   new  XmlDocument();
 3                   this ._xDoc.LoadXml(
 4                       " <?xml version=\"1.0\" encoding=\"gb2312\" ?> "   +
 5                           " <root> " +
 6                               " <Principles> "   +
 7                               " </Principles> " +
 8                               " <Results> " +
 9                               " </Results> " +
10                           " </root> "
11                      );
12                   try
13                  {
14                       this ._xDoc.Save(fileName);
15                  }
16                   catch  (Exception ex)
17                  {
18                      MessageBox.Show(ex.Message);
19                  }

      (1.2)向XML文件中的指定位置添加节点

      这里要说的是,我要添加的节点的数据结构是<ID,Content,Suggestion>。再者,添加节点的时候,用在树上直接找的办法,比较笨,用xPath会好很多,可惜时间紧没学明白……

addToXMLDocument
 1           public   void  addToXMLDocument( string  id,  string  content,  string  suggestion)
 2          {
 3              XmlNode Term  =   this ._xDoc.CreateNode(XmlNodeType.Element,  " Term " "" );
 4 
 5              XmlElement ID  =   this ._xDoc.CreateElement( " ID " );
 6              ID.InnerText  =  id;
 7              Term.AppendChild(ID);
 8 
 9              XmlElement Content  =   this ._xDoc.CreateElement( " Content " );
10              Content.InnerText  =  content;
11              Term.AppendChild(Content);
12 
13              XmlElement Suggestion  =   this ._xDoc.CreateElement( " Suggestion " );
14              Suggestion.InnerText  =  suggestion;
15              Term.AppendChild(Suggestion);
16 
17               this ._xDoc.ChildNodes.Item( 1 ).ChildNodes.Item( 0 ).AppendChild(Term);
18 
19               try
20              {
21                   this ._xDoc.Save( this ._fileName);
22              }
23               catch  (Exception ex)
24              {
25                  MessageBox.Show(ex.Message);
26              }
27          }

      (1.3)从XML文件中删除指定的节点

      在应用中,我是在ListView中把XML的数据打出来,通过勾选CheckBox选定删除的对象。

DeleteNodeFromXmlDocument
 1           private   void  button4_Click( object  sender, EventArgs e)
 2          {
 3              XmlDocument xDoc  =   new  XmlDocument();
 4              xDoc.Load( this ._fileName);
 5               foreach  (ListViewItem lItem  in  Listview1.Items)
 6              {
 7                   if  (lItem.Checked  ==   true )
 8                  {
 9                       // int index = Convert.ToInt32(lItem.SubItems[1].Text, 10);
10                       foreach  (XmlNode xNode  in  xDoc.ChildNodes.Item( 1 ).ChildNodes.Item( 0 ).ChildNodes)
11                      {
12                           if  (String.Compare(xNode.ChildNodes[ 0 ].InnerText, lItem.SubItems[ 1 ].Text)  ==   0 )
13                          {
14                              xDoc.ChildNodes.Item( 1 ).ChildNodes.Item( 0 ).RemoveChild(xNode);
15                          }
16                      }
17                      Listview1.Items.Remove(lItem);
18                  }
19              }
20              xDoc.Save( this ._fileName);
21              Re_Load();
22          }

      (2)动态界面生成

       这个算是我在第一阶段遇到的最大的一个问题。作为一个C#的菜鸟,习惯了拖拖拽拽弄出一个窗口界面,当被要求根据用户输入,动态生成界面的时候,直接歇菜了……

       在网上找了很多,可惜很多都不适用,忘记后来是在哪里找到的答案,向那位记不起名儿的童鞋致敬了。

       是这样的,所谓的动态生成,就是把原来在Form.Designer.cs中代码,搬到你自己的代码中去。比如,你原来在Form.Designer.cs中有这样的代码

Example: Form.Designer.cs
1               //  
2               //  button1
3               //  
4               this .button1.Location  =   new  System.Drawing.Point( 57 97 );
5               this .button1.Name  =   " button1 " ;
6               this .button1.Size  =   new  System.Drawing.Size( 75 23 );
7               this .button1.TabIndex  =   0 ;
8               this .button1.Text  =   " button1 " ;
9               this .button1.UseVisualStyleBackColor  =   true ;

       你可以写到你自定义的Button2的Click事件中,这样,在你点击Button2后,就会在窗口上新加一个Button1出来

Example: ButtonClick
 1           private   void  button2_Click( object  sender, EventArgs e)
 2          {
 3               //  
 4               //  button1
 5               //  
 6               this .button1.Location  =   new  System.Drawing.Point( 57 97 );
 7               this .button1.Name  =   " button1 " ;
 8               this .button1.Size  =   new  System.Drawing.Size( 75 23 );
 9               this .button1.TabIndex  =   0 ;
10               this .button1.Text  =   " button1 " ;
11               this .button1.UseVisualStyleBackColor  =   true ;
12               this .Controls.Add( this .button1);
13               this .ResumeLayout( false );
14          }

       (2.1)说一说我自己做的那个东西,我设计如下:在Form中先放好一个大Panel,然后,根据用户输入,动态加入指定个数的组件Component。在每个Component里面,包含一个GroupBox,三个Label,三个TextBox,还有一些坐标的参数。

        要说一下,窃以为,动态加入组件,最麻烦的就是算坐标。那么多的东西,你需要事先把每个组件的坐标位置和大小都算好了,然后,你才可以保证你按下“添加”之后,你的组件能按照你想要的方式,呈现在窗口上。所以我对应每一条要添加的数据项,构造了上面的一个Component,然后给每个Component设置索引值,只要得到索引值,那么,这个Component的位置也就确定了。

        比较欣慰的是,这个组件的坐标是按相对位置计算的:你设置GroupBox的坐标时,你只要算好你在Panel中的位置就可以了,你不用管Panel在Form的哪里。同样,你的Label,TextBox只要算好在一个200*50的GroupBox中的位置就可以了,剩下的你就不用管了。或许是以前没有注意过这个问题,反正我觉得这一性质在我做的过程中,省了不少的事儿。

        这就完了么?No,还有一个我开始都没注意到的问题:最大化。对,你算的坐标是死的,当用户点击“最大化”按钮后,你的界面就会面目全非,所以,这里又要加入一个新的东西:TableLayoutPanel。Yes,需要把前面的那些写死的坐标,都放到这个TableLayoutPanel里面来,设置好每个组件的位置,这样,在“最大化”之后,依然能够保持良好的布局。

Component
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Drawing;
using  System.Windows.Forms;

namespace  app01_Generate
{
    
class  Component
    {
        
#region  成员变量定义

        
public   static   int  OFFSET  =   3 ;
        
public   static   int  HEIGHT  =   98 ;
        
private   int  _weight;
        
private   int  _index;
        
private  GroupBox _gb;
        
private  Label _lb1, _lb2, _lb3;
        
private  TextBox _tb1, _tb2, _tb3;
        
private  TableLayoutPanel _tlp;

        
#endregion

        
public  Component( int  index, int  weight)
        {
            
this ._index  =  index;
            
this ._weight  =  weight;

            
this ._gb  =   new  GroupBox();
            
this ._gb.Location  =   new  Point( 3 , OFFSET  +   this ._index  *  HEIGHT);
            
this ._gb.Size  =   new  System.Drawing.Size( this ._weight,  92 );
            
this ._gb.Anchor  =  ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top  |  System.Windows.Forms.AnchorStyles.Left)
                        
|  System.Windows.Forms.AnchorStyles.Right)));
            
            
this ._tlp  =   new  TableLayoutPanel();
            
this ._tlp.Anchor  =  ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top  |  System.Windows.Forms.AnchorStyles.Bottom)
                        
|  System.Windows.Forms.AnchorStyles.Left)
                        
|  System.Windows.Forms.AnchorStyles.Right)));
            
this ._tlp.ColumnCount  =   25 ;
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.ColumnStyles.Add( new  System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 4F));
            
this ._tlp.Location  =   new  System.Drawing.Point( 6 20 );
            
this ._tlp.Name  =   " _tlp " ;
            
this ._tlp.RowCount  =   1 ;
            
this ._tlp.RowStyles.Add( new  System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
            
this ._tlp.Size  =   new  System.Drawing.Size( this ._weight  -   12 66 );

            
this ._lb1  =   new  Label();
            
this ._lb1.Anchor  =  ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
            
this ._lb1.AutoSize  =   true ;
            
this ._tlp.SetColumnSpan( this ._lb1,  2 );
            
this ._lb1.Font  =   new  System.Drawing.Font( " 微软雅黑 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._lb1.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   8   /   741 ),  0 );
            
this ._lb1.Name  =   " _lb1 " ;
            
this ._lb1.Size  =   new  System.Drawing.Size( 47 19 );
            
this ._lb1.Text  =   " ID " ;


            
this ._lb2  =   new  Label();
            
this ._lb2.Anchor  =  ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
            
this ._lb2.AutoSize  =   true ;
            
this ._tlp.SetColumnSpan( this ._lb2,  2 );
            
this ._lb2.Font  =   new  System.Drawing.Font( " 微软雅黑 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._lb2.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   124   /   741 ),  0 );
            
this ._lb2.Name  =   " _lb2 " ;
            
this ._lb2.Size  =   new  System.Drawing.Size( 47 38 );
            
this ._lb2.Text  =   " Content " ;

            
this ._lb3  =   new  Label();
            
this ._lb3.Anchor  =  ((System.Windows.Forms.AnchorStyles)(( System.Windows.Forms.AnchorStyles.Right)));
            
this ._lb3.AutoSize  =   true ;
            
this ._tlp.SetColumnSpan( this ._lb3,  2 );
            
this ._lb3.Font  =   new  System.Drawing.Font( " 微软雅黑 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._lb3.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   501   /   741 ),  0 );
            
this ._lb3.Name  =   " _lb3 " ;
            
this ._lb3.Size  =   new  System.Drawing.Size( 47 38 );
            
this ._lb3.Text  =   " Suggestion " ;

            
this ._tb1  =   new  TextBox();
            
this ._tb1.Anchor  =  ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
            
|  System.Windows.Forms.AnchorStyles.Right)));
            
this ._tlp.SetColumnSpan( this ._tb1,  2 );
            
this ._tb1.Font  =   new  System.Drawing.Font( " 仿宋 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._tb1.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   61   /   741 ),  3 );
            
this ._tb1.Name  =   " _tb1 " ;
            
this ._tb1.Size  =   new  System.Drawing.Size( 52 29 );

            
this ._tb2  =   new  TextBox();
            
this ._tb2.Anchor  =  ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
                        
|  System.Windows.Forms.AnchorStyles.Right)));
            
this ._tlp.SetColumnSpan( this ._tb2,  11 );
            
this ._tb2.Font  =   new  System.Drawing.Font( " 仿宋 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._tb2.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   177   /   741 ),  3 );
            
this ._tb2.Multiline  =   true ;
            
this ._tb2.Name  =   " _tb2 " ;
            
this ._tb2.ScrollBars  =  System.Windows.Forms.ScrollBars.Vertical;
            
this ._tb2.Size  =   new  System.Drawing.Size( 313 48 );

            
this ._tb3  =   new  TextBox();
            
this ._tb3.Anchor  =  ((System.Windows.Forms.AnchorStyles)((( System.Windows.Forms.AnchorStyles.Left)
                        
|  System.Windows.Forms.AnchorStyles.Right)));
            
this ._tlp.SetColumnSpan( this ._tb3,  6 );
            
this ._tb3.Font  =   new  System.Drawing.Font( " 仿宋 " 10.5F , System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (( byte )( 134 )));
            
this ._tb3.Location  =   new  System.Drawing.Point(( int )(( this ._weight  -   12 *   554   /   741 ),  3 );
            
this ._tb3.Multiline  =   true ;
            
this ._tb3.Name  =   " _tb3 " ;
            
this ._tb3.ScrollBars  =  System.Windows.Forms.ScrollBars.Vertical;
            
this ._tb3.Size  =   new  System.Drawing.Size( 184 48 );

            
this ._tlp.Controls.Add( this ._lb1,  0 0 );
            
this ._tlp.Controls.Add( this ._tb1,  2 0 );
            
this ._tlp.Controls.Add( this ._lb2,  4 0 );
            
this ._tlp.Controls.Add( this ._lb3,  17 0 );
            
this ._tlp.Controls.Add( this ._tb3,  19 0 );
            
this ._tlp.Controls.Add( this ._tb2,  6 0 );
            
this ._gb.Controls.Add( this ._tlp);

        }

        
public   void  addToPanel( ref  Panel pnl)
        {
            pnl.Controls.Add(
this ._gb);
        }

        
public   void  Clear()
        {
            
this ._tb1.Clear();
            
this ._tb2.Clear();
            
this ._tb3.Clear();
        }

        
public   string  getID()
        {
            
return   this ._tb1.Text.Trim();
        }

        
public   string  getContent()
        {
            
return   this ._tb2.Text.Trim();
        }

        
public   string  getSuggestion()
        {
            
return   this ._tb3.Text.Trim();
        }

        
public   bool  Check()
        {
            
if  ( string .IsNullOrEmpty( this ._tb1.Text.Trim())  ==   false   ||
                
string .IsNullOrEmpty( this ._tb2.Text.Trim())  ==   false   ||
                
string .IsNullOrEmpty( this ._tb3.Text.Trim())  ==   false
              &nbs
目录
相关文章
|
7天前
|
SQL API 定位技术
基于C#使用winform技术的游戏平台的实现【C#课程设计】
本文介绍了基于C#使用WinForms技术开发的游戏平台项目,包括项目结构、运行截图、实现功能、部分代码说明、数据库设计和完整代码资源。项目涵盖了登录注册、个人信息修改、游戏商城列表查看、游戏管理、用户信息管理、数据分析等功能。代码示例包括ListView和ImageList的使用、图片上传、图表插件使用和SQL工具类封装,以及高德地图天气API的调用。
基于C#使用winform技术的游戏平台的实现【C#课程设计】
|
10天前
|
API C#
C# 一分钟浅谈:文件系统编程
在软件开发中,文件系统操作至关重要。本文将带你快速掌握C#中文件系统编程的基础知识,涵盖基本概念、常见问题及解决方法。文章详细介绍了`System.IO`命名空间下的关键类库,并通过示例代码展示了路径处理、异常处理、并发访问等技巧,还提供了异步API和流压缩等高级技巧,帮助你写出更健壮的代码。
25 2
|
14天前
|
SQL 开发框架 安全
并发集合与任务并行库:C#中的高效编程实践
在现代软件开发中,多核处理器普及使多线程编程成为提升性能的关键。然而,传统同步模型在高并发下易引发死锁等问题。为此,.NET Framework引入了任务并行库(TPL)和并发集合,简化并发编程并增强代码可维护性。并发集合允许多线程安全访问,如`ConcurrentQueue&lt;T&gt;`和`ConcurrentDictionary&lt;TKey, TValue&gt;`,有效避免数据不一致。TPL则通过`Task`类实现异步操作,提高开发效率。正确使用这些工具可显著提升程序性能,但也需注意任务取消和异常处理等常见问题。
26 1
|
23天前
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
43 11
|
15天前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
34 1
|
22天前
|
人工智能 前端开发 Devops
.NET技术自发布以来,在软件开发领域发挥了重要作用
【9月更文挑战第12天】.NET技术自发布以来,在软件开发领域发挥了重要作用。本文分为三部分探讨其在现代开发中的应用:首先介绍.NET的核心价值,包括语言多样性、强大的开发工具支持、丰富的类库、跨平台能力和活跃的社区;接着分析其在企业级应用、Web开发、移动应用、云服务及游戏开发中的实际应用;最后讨论.NET面临的挑战与未来趋势,如性能优化、容器化、AI集成及跨平台框架竞争等。通过不断的技术创新和社区驱动,.NET将持续推动软件开发的进步。
27 4
|
27天前
|
传感器 应用服务中间件 Linux
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
|
15天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
49 0
|
27天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
27 7
|
25天前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
38 0