C# 動態生成word文檔 [C#學習筆記3]關於Main(string[ ] args)中args命令行參數 實現DataTables搜索框查詢結果高亮顯示 二維碼神器QRCoder Asp.net

本文以一個簡單的小例子,簡述利用C#語言開發word表格相關的知識,僅供學習分享使用,若有不足之處,還請指正。javascript

在工程中引用word的動態庫

在項目中,點擊項目名稱右鍵-->管理NuGet程序包,打開NuGet包管理器窗口,進行搜索下載便可,以下圖所示:css

涉及知識點

  1. _Application: 表示word應用程序的接口,對應的實現類是Application類。
  2. _Document:表示一個word文檔,經過_Application對應的文檔接口進行建立。
  3. Paragraph:表示一個段落,經過_Document對象的相關方法進行建立。
  4. Table:表示一個表格,經過_Document對象的相關方法進行建立。
  5. Range:表示一個區域,能夠是一個段落,也能夠是一個表格,也能夠是一個單元格,能夠Range.select()將光標移動到當前區域。
  6. 移動焦點:wordApp.Selection.MoveDown(ref wdLine, ref ncount, ref oMissing);//移動焦點

生成文檔效果圖

核心代碼

複製代碼
  1 using Microsoft.Office.Interop.Word;
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Data;
  5 using System.IO;
  6 using System.Linq;
  7 using System.Reflection;
  8 using System.Text;
  9 using System.Threading.Tasks;
 10 
 11 namespace ETWord
 12 {
 13     public class WordHelper
 14     {
 15         public static void CreateWordFile(string filePath)
 16         {
 17             
 18             try
 19             {
 20                 CreateFile(filePath);
 21                 //
 22                 MessageFilter.Register();
 23                 object wdLine = WdUnits.wdLine;
 24                 object oMissing = Missing.Value;
 25                 object fileName = filePath;
 26                 object heading2 = WdBuiltinStyle.wdStyleHeading2;
 27                 object heading3 = WdBuiltinStyle.wdStyleHeading3;
 28                 
 29                 _Application wordApp = new Application();
 30                 wordApp.Visible = true;
 31                 _Document wordDoc = wordApp.Documents.Open(ref fileName, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);
 32                 System.Data.DataTable dtDepts = DatabaseHelper.getDept();
 33                 int ii = 0;
 34                 foreach (DataRow dr in dtDepts.Rows)
 35                 {
 36                     string dept = dr["dept"].ToString();
 37                     Paragraph oPara0 = wordDoc.Content.Paragraphs.Add(ref oMissing);
 38                     oPara0.Range.Text = string.Format("{0}-{1}", ii + 1, dept);
 39                     //oPara0.Range.Font.Bold = 1;
 40                     //oPara0.Format.SpaceAfter = 5;
 41                     oPara0.Range.Select();
 42                     oPara0.set_Style(ref heading2);
 43                     oPara0.Range.InsertParagraphAfter();
 44                     System.Data.DataTable dtTemplate = DatabaseHelper.getTemplateByDept(dept);
 45                     int jj = 0;
 46                     foreach (DataRow dr1 in dtTemplate.Rows)
 47                     {
 48                         string template = dr1["template"].ToString();
 49                         string user1 = dr1["user1"].ToString();
 50                         string remark = dr1["remark"].ToString();
 51                         System.Data.DataTable dtData = DatabaseHelper.getDataByDeptAndTemplate(dept, template);
 52                         int count = dtData.Rows.Count;
 53                         int row = count + 4;
 54                         int column = 5;
 55                         object ncount = 1;
 56 
 57                         wordApp.Selection.MoveDown(ref wdLine, ref ncount, ref oMissing);
 58                         wordApp.Selection.TypeParagraph();
 59                         Paragraph oPara1 = wordDoc.Content.Paragraphs.Add(ref oMissing);
 60                         oPara1.Range.Select();
 61                         oPara1.Range.Text = string.Format("{0}-{1}、{2}", ii + 1, jj + 1, template);
 62                         //oPara1.Range.Font.Bold = 1;
 63                         //oPara1.Format.SpaceAfter = 5;
 64                         oPara1.set_Style(ref heading3);
 65                         oPara1.Range.InsertParagraphAfter();
 66                         wordApp.Selection.MoveDown(ref wdLine, ref ncount, ref oMissing);
 67                         wordApp.Selection.TypeParagraph();
 68                         //設置表格
 69                         Table table = wordDoc.Tables.Add(wordApp.Selection.Range, row, column, ref oMissing, ref oMissing);
 70                        
 71                         table.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
 72                         table.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
 73                         table.Range.Font.Bold = 0;
 74                         table.PreferredWidthType = WdPreferredWidthType.wdPreferredWidthAuto;
 75                         table.Columns[1].Width = 60f;
 76                         table.Columns[2].Width = 100f;
 77                         table.Columns[3].Width = 100f;
 78                         table.Columns[4].Width = 60f;
 79                         table.Columns[5].Width = 100f;
 80                         //列的合併
 81                         Cell cell = table.Cell(1, 2);
 82                         cell.Merge(table.Cell(1, 5));
 83                         Cell cell2 = table.Cell(2, 2);
 84                         cell2.Merge(table.Cell(2, 5));
 85                         Cell cell3 = table.Cell(3, 2);
 86                         cell3.Merge(table.Cell(3, 5));
 87                         //賦值
 88                         table.Cell(1, 1).Range.Text = "流程名稱:";
 89                         table.Cell(2, 1).Range.Text = "使用人:";
 90                         table.Cell(3, 1).Range.Text = "流程說明:";
 91                         table.Cell(4, 1).Range.Text = "節點";
 92                         table.Cell(4, 2).Range.Text = "節點名";
 93                         table.Cell(4, 3).Range.Text = "處理人員";
 94                         table.Cell(4, 4).Range.Text = "處理方式";
 95                         table.Cell(4, 5).Range.Text = "跳轉信息";
 96                         table.Cell(1, 2).Range.Text = template;
 97                         table.Cell(2, 2).Range.Text = user1;
 98                         table.Cell(3, 2).Range.Text = remark;
 99                         int kk = 5;
100                         foreach (DataRow dr2 in dtData.Rows)
101                         {
102                             table.Cell(kk, 1).Range.Text = (kk - 4).ToString();
103                             table.Cell(kk, 2).Range.Text = dr2["NodeName"].ToString();
104                             table.Cell(kk, 3).Range.Text = dr2["DoName"].ToString();
105                             table.Cell(kk, 4).Range.Text = dr2["DoType"].ToString();
106                             table.Cell(kk, 5).Range.Text = string.Empty;
107                             kk++;
108                         }
109                         table.Cell(kk - 1, 5).Range.Select();
110 
111                         wordApp.Selection.MoveDown(ref wdLine, ref ncount, ref oMissing);//移動焦點
112                         wordApp.Selection.TypeParagraph();//插入段落
113 
114                         jj++;
115                     }
116                     ii++;
117                 }
118 
119                 //保存
120                 wordDoc.Save();
121                 wordDoc.Close(ref oMissing, ref oMissing, ref oMissing);
122                 wordApp.Quit(ref oMissing, ref oMissing, ref oMissing);
123                 MessageFilter.Revoke();
124 
125             }
126             catch (Exception e)
127             {
128                 Console.WriteLine(e.Message);
129                 Console.WriteLine(e.StackTrace);
130 
131             }
132         }
133 
134         private static void CreateFile(string filePath)
135         {
136             if (!File.Exists(filePath))
137             {
138                 using (FileStream fs = File.Create(filePath))
139                 {
140 
141                 }
142             }
143         }
144     }
145 }
複製代碼

備註

  1.  插入多個表格時,表格容易嵌套,主要是因爲往下移動的行數不對,後來經過選中表格右下角的單元格,將光標移動到表格右下角,而後再往下移動兩行,便可解決表格嵌套的問題。
  2. 單元格合併問題,當單元格合併時,單元格的位置也隨之改變,如:水平方向第二,三兩個單元格合併,則原來的第四個單元格的座標就會變成第三個單元格。
  3. 開發運行須要在電腦上安裝office組件,或者也能夠安裝wps。

關於源碼下載連接html

 

 

[C#學習筆記3]關於Main(string[ ] args)中args命令行參數

 

Main(string[] args)方法是C#程序的入口,程序從這裏開始執行,在這裏結束。C#代碼邏輯要包含在一個類型(Type)中,遊離的、全局的變量或函數是不存在的,這裏的類型包括類(class)、接口(interface)、結構(struct)、枚舉(enum)和委託(delegate)。Main()方法包含在一個類中,這個類的默認名字叫做Program,包含Main()的類叫做應用程序對象(Application Object)。新建一個控制檯應用程序(ConsoleApplication)。java

  新建一個控制檯應用程序

  初始程序

程序中包含的初始代碼爲:jquery

複製代碼
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace exer
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13         }
14     }
15 }
複製代碼

上面代碼中,exer是定義的命名空間,與建立的控制檯應用程序的名稱相同;Main(string[] args)是程序的主方法(或稱主函數),即程序的入口,程序將從這裏開始執行,也在這裏結束;Program是包含Main()方法的類,即上面提到的應用程序對象。git

一個控制檯應用程序項目中能夠存在多個應用程序對象,便可以存在多個Main()方法分佈在不一樣的類中。可是程序每次執行時只能選擇啓動一個應用程序對象,即只能選擇一個Main()方法做爲程序的入口。通知編譯器將哪一個Main()方法做爲程序的入口能夠在項目屬性編輯器的應用程序(Application)選項卡中的啓動對象(Startup Object)處設置。github

  Startup object

下面編寫兩個應用程序對象,並分別啓動測試,代碼以下。其中,將用不到的using引用刪去了;Console.ReadLine()方法用來從控制檯接收鍵盤輸入的一段以回車符結束的字符串,這裏起到暫停控制檯的做用(不然調試程序時,控制檯會一閃而過!),但也能夠不調試程序而是直接運行,就不會出現一閃而過的狀況了。ajax

複製代碼
 1 using System;
 2 
 3 namespace exer
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Console.WriteLine("From Program!");
10             Console.ReadLine();
11         }
12     }
13 
14     class AnotherProgram
15     {
16         static void Main(string[] args)
17         {
18             Console.WriteLine("From AnotherProgram!!");
19             Console.ReadLine();
20         }
21     }
22 }
複製代碼

調試程序,編譯器報錯。數據庫

error

打開項目屬性編輯器,在應用程序(Application)選項卡中的啓動對象(Startup Object)下拉框中選擇程序入口點,分別運行程序,查看結果。json

  在Startup object下拉框處選擇應用程序對象

  FromProgram

  FromAnotherProgram


1、關於Main()方法

  Main()方法形式通常以下:

複製代碼
1     class Program
2     {
3         static void Main(string[] args)
4         {
5 
6         }
7     }
複製代碼

  其中,static表示Main()方法是一個靜態方法;void表示Main()方法返回值爲空,是說咱們不須要在Main()方法結尾處寫上return語句來顯示定義一個返回值,但程序在運行結束後仍是會自動返回給系統一個表示程序是否正常結束的值(0或其餘值,0表示程序正常結束、其餘值如-1表示程序有錯誤發生);Main()方法中有一個字符串數組類型的形式參數,包含程序啓動時傳遞給系統的命令行參數。

  除了這種默認的形式,Main()方法還能夠是其餘的形式。構造什麼樣的Main()方法須要考慮兩個問題:①程序執行結束後是否要向系統返回一個值 ②程序是否須要處理用戶提供的命令行參數

複製代碼
 1     class Program  //默認形式
 2     {
 3         static void Main(string[] args)
 4         {
 5 
 6         }
 7     }
 8     class Program
 9     {


10 static int Main(string[] args) 11 { 12 return 0; 13 } 14 } 15 class Program 16 { 17 static void Main() 18 { 19 20 } 21 } 22 class Program 23 { 24 static int Main() 25 { 26 return 0; 27 } 28 }
複製代碼

 

2、提供給程序命令行參數

  Main(string[] args)方法中,用戶提供的命令行參數是保存在args字符串數組中的,當提供參數後,在Main()方法中就能夠遍歷args數組查看這些參數。設置遍歷參數的C#語句(也可使用foreach)。

1             for(int i=0;i<args.Length;i++)
2                 Console.WriteLine("arg:{0}",args[i]);

  那麼,如何提供給程序這些命令行參數呢?有兩種方法。

  ①Developer Command Prompt命令行中提供參數

  打開DCP(開發人員命令提示),切換到程序所在路徑,運行已經編譯好的exer.exe應用程序同時輸入參數,參數能夠不包括前綴('\'或'-',固然也能夠包含..),以空格分隔。

    命令行輸入參數

  ②Visual Studio項目屬性編輯器中指定命令行參數,一樣以空格分隔

    Visual Studio項目屬性編輯器中設置命令行參數

    vs輸入參數

 

3、代碼訪問命令行參數的其餘方法

  當提供給程序命令行參數後,可使用for或者foreach語句進行args參數的遍歷,還可使用System.Environment類的靜態方法GetCommandLineArgs()進行參數的訪問。System.Environment.GetCommandLineArgs()返回一個字符串數組,即包含命令行參數的數組。

複製代碼
 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("From Program!");
 4 
 5             //for(int i=0;i<args.Length;i++)
 6             //    Console.WriteLine("arg:{0}",args[i]);
 7 
 8             string[] arr = System.Environment.GetCommandLineArgs();
 9             for(int i=0;i<arr.Length;i++)
10                 Console.WriteLine("arg:{0}",arr[i]);
11             Console.ReadLine();
12         }
複製代碼

  Environment.GetCommandLineArgs訪問命令行參數

  System.Environment.GetCommandLineArgs()返回的字符串數組中,第一個字符串是當前應用程序的徹底路徑名,其餘字符串是用戶提供給程序的命令行參數。當使用這種方法獲取命令行參數時,Main()括號中能夠去掉string[] args形式參數了。

 

 

 

實現DataTables搜索框查詢結果高亮顯示

 

DataTables是封裝好的HTML表格插件,豐富了HTML表格的樣式,提供了即時搜索、分頁等多種表格高級功能。用戶能夠編寫不多的代碼(甚至只是使用官方的示例代碼),作出一個漂亮的表格以展現數據。關於DataTables的更多信息,請查看:http://www.datatables.club/https://datatables.net/。下圖將要展現的南京景點遊記的相關數據,在DataTables表格中展現出來。

遊記數據

遊記數據在DataTables表格中展現出來

上面DataTable表格中的即時搜索、分頁等功能是建立好DataTables對象後就有的,不用編寫相關代碼。「即時搜索」是指隨着鍵入字符的變化,表格中會出現變化着的匹配信息。

查詢一我的

可是DataTables自己沒有提供搜索結果高亮顯示的功能,須要引入相關JavaScript文件並編寫相關代碼。DataTables中文網提供了這一js文件,可是例子中少寫了一條設置樣式的語句,因此沒法實現高亮顯示的功能。http://www.datatables.club/blog/2014/10/22/search-result-highlighting.html

查詢南京


1、DataTables的相關代碼

1.代碼骨架

  使用DataTables表格須要引入jQuery;例子使用了在線的DataTables CDN。

複製代碼
 1 <html>
 2 <head>
 3     <meta charset="utf-8">
 4     <title>..</title>
 5     
 6     <!-- jQuery 引入 -->
 7     <script src="jquery-3.0.0.min.js"></script>
 8     
 9     <!-- DataTables 引入 -->
10     <link rel="stylesheet" href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css">
11     <script src="http://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
12 </head>
13 
14 <body>
15 
16 </body>
17 </html>
複製代碼

2.建立表格

  在<body></body>標籤中建立一個<table>元素,設置table表格的表頭信息。

複製代碼
 1 <body>
 2     <table id="table" class="display">
 3         <thead>
 4             <tr>
 5                 <th>暱稱</th>
 6                 <th>所在地</th>
 7                 <th>遊記文章</th>
 8                 <th>出發時間</th>
 9                 <th>出行天數</th>
10                 <th>人物</th>
11                 <th>人均費用</th>
12                 <th>相關連接</th>
13             </tr>
14         </thead>
15         
16         <tbody>
17         
18         </tbody>
19     </table>
20 </body>
複製代碼

 3.配置table成DataTable

  <script></script>標籤中對DataTable進行相關設置,這裏不對其餘樣式進行設置,只配置表格的數據源。DataTables表格支持多種數據源,JavaScript對象數組、ajax返回來的數據、json格式數據等等。這裏將Excel表格中的數據以對象數組的形式存放在"南京遊記.js"文件裏(數組中每個元素是一個對象,即一條遊記記錄信息),再在DataTables所在HTML頁面中src引入("南京景點.js"文件中只有一個JavaScript對象數組)。採用這種方法配置數據源,須要在DataTable的構造函數中設置columns屬性,注意這裏和Table表頭信息要相對應。關於DataTables樣式設置及數據源配置的其餘方式請查看官方文檔中的相關內容:https://datatables.net/examples/index

複製代碼
 1 <body>
 2     <table id="table" class="display">
 3         <thead>
 4             <tr>
 5                 <th>暱稱</th>
 6                 <th>所在地</th>
 7                 <th>遊記文章</th>
 8                 <th>出發時間</th>
 9                 <th>出行天數</th>
10                 <th>人物</th>
11                 <th>人均費用</th>
12                 <th>相關連接</th>
13             </tr>
14         </thead>
15         
16         <tbody>
17         
18         </tbody>
19     </table>
20     
21     <!-- DataTables 數據源 -->
22     <script src="南京遊記.js"></script>
23     
24     <!-- DataTables 設置 -->
25     <script>
26         $(document).ready(function(){
27             var table=$('#table').DataTable({
28                 data:data,
29                 columns:[
30                     {data:'暱稱'},
31                     {data:'所在地'},
32                     {data:'遊記文章'},
33                     {data:'出發時間'},
34                     {data:'出行天數'},
35                     {data:'人物'},
36                     {data:'人均費用'},
37                     {data:'相關連接'}
38                 ]
39             })
40         });
41     </script>
42 </body>
複製代碼

   南京遊記js文件

複製代碼
 1 <html>
 2 <head>
 3     <meta charset="utf-8">
 4     <title>..</title>
 5     
 6     <!-- jQuery 引入 -->
 7     <script src="jquery-3.0.0.min.js"></script>
 8     
 9     <!-- DataTables 引入 -->
10     <link rel="stylesheet" href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css">
11     <script src="http://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
12     
13 </head>
14 
15 <body>
16     <table id="table" class="display">
17         <thead>
18             <tr>
19                 <th>暱稱</th>
20                 <th>所在地</th>
21                 <th>遊記文章</th>
22                 <th>出發時間</th>
23                 <th>出行天數</th>
24                 <th>人物</th>
25                 <th>人均費用</th>
26                 <th>相關連接</th>
27             </tr>
28         </thead>
29         
30         <tbody>
31         
32         </tbody>
33     </table>
34     
35     <!-- DataTables 數據源 -->
36     <script src="南京遊記.js"></script>
37     
38     <!-- DataTables 設置 -->
39     <script>
40         $(document).ready(function(){
41             var table=$('#table').DataTable({
42                 data:data,
43                 columns:[
44                     {data:'暱稱'},
45                     {data:'所在地'},
46                     {data:'遊記文章'},
47                     {data:'出發時間'},
48                     {data:'出行天數'},
49                     {data:'人物'},
50                     {data:'人均費用'},
51                     {data:'相關連接'}
52                 ]
53             })
54         });
55     </script>
56 </body>
57 </html>
複製代碼

 

2、官方提供的搜索框高亮顯示的方法

  DataTables中文網提供了高亮顯示的一種方法(http://www.datatables.club/blog/2014/10/22/search-result-highlighting.html),提供的js文件是能夠實現高亮顯示功能的,可是要在<head></head>中添加<style>樣式以設置高亮顯示的顏色,不然將沒有高亮顯示的效果。

複製代碼
1     <!-- DataTables搜索內容後高亮顯示 -->
2     <style>
3         .highlight {
4             background-color: skyblue
5         }
6     </style>
複製代碼

  這種方法的具體步驟爲:

  1.將提供的js文件複製後保存成一個js文件,並在代碼中src引入

  highlightjs1

  2.在DataTable的構造函數後,添加Table的draw事件,即時搜索框中字符變化時會觸發事件

複製代碼
 1     <!-- DataTables 設置 -->
 2     <script>
 3         $(document).ready(function(){
 4             var table=$('#table').DataTable({
 5                 data:data,
 6                 columns:[
 7                     {data:'暱稱'},
 8                     {data:'所在地'},
 9                     {data:'遊記文章'},
10                     {data:'出發時間'},
11                     {data:'出行天數'},
12                     {data:'人物'},
13                     {data:'人均費用'},
14                     {data:'相關連接'}
15                 ]
16             });
17             
18             //監聽DataTable重繪事件(*)
19             table.on('draw', function () {
20                 var body = $(table.table().body());
21                 body.unhighlight();
22                 body.highlight(table.search());
23             });
24         });
25     </script>
複製代碼
複製代碼
 1 <html>
 2 <head>
 3     <meta charset="utf-8">
 4     <title>..</title>
 5     
 6     <!-- jQuery 引入 -->
 7     <script src="jquery-3.0.0.min.js"></script>
 8     
 9     <!-- DataTables 引入 -->
10     <link rel="stylesheet" href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min.css">
11     <script src="http://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
12     
13     <!-- DataTables搜索框查詢結果高亮顯示 -->
14     <script src="highlight.js"></script>
15     
16     <!-- DataTables搜索內容後高亮顯示 -->
17     <style>
18         .highlight {
19             background-color: skyblue
20         }
21     </style>
22 </head>
23 
24 <body>
25     <table id="articlesTable" class="display">
26         <thead>
27             <tr>
28                 <th>暱稱</th>
29                 <th>所在地</th>
30                 <th>遊記文章</th>
31                 <th>出發時間</th>
32                 <th>出行天數</th>
33                 <th>人物</th>
34                 <th>人均費用</th>
35                 <th>相關連接</th>
36             </tr>
37         </thead>
38         <tbody>
39         
40         </tbody>
41     </table>
42     
43     <script src="南京遊記.js"></script>
44     
45     <!-- DataTables 設置 -->
46     <script>
47         $(document).ready(function(){
48             var table=$('#articlesTable').DataTable({
49                 data:data,
50                 columns:[
51                     {data:'暱稱'},
52                     {data:'所在地'},
53                     {data:'遊記文章'},
54                     {data:'出發時間'},
55                     {data:'出行天數'},
56                     {data:'人物'},
57                     {data:'人均費用'},
58                     {data:'相關連接'}
59                 ]
60             });
61             
62             //監聽DataTable重繪事件(*)
63             table.on('draw', function () {
64                 var body = $(table.table().body());
65                 body.unhighlight();
66                 body.highlight(table.search());
67             });
68         });
69     </script>
70 </body>
71 </html>
複製代碼

  注意,官網提供的這個js文件中,定義高亮顯示的函數是highlight(),去除高亮顯示的函數是unhighlight()。

 

3、搜索框查詢結果高亮顯示的其餘方法

  https://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html。這裏提供了能夠實現高亮顯示功能的其餘兩個JavaScript文件,若是引入這裏面的js文件,高亮顯示的函數是highlight()沒有變,但去除高亮顯示的函數變成了removeHighlight()。

  引入這3個js文件中的任一個並編寫相應高亮/去高亮的代碼語句,都是能夠實現DataTables搜索框查詢結果高亮顯示功能的,可是注意要在<head></head>標籤中設置高亮顯示的背景顏色,不然沒有高亮顯示的效果。

 

4、總結

  實現DataTables搜索框查詢結果高亮顯示的功能須要引入JavaScript文件,文中提供了3種這類文件,並說明了要配套編寫的相關代碼。


文中例子的連接分享: https://pan.baidu.com/s/1sT3K9tXskhx-YNAs7W5gHw

二維碼神器

如今出門在外,二維碼隨處可見,吃個東西、買個青菜,沒有weixin或者zhifubao的掃一掃來付款,阿姨都嫌棄你了。

這裏推薦一款開源二維碼的第三方庫:QRCoder

QRCoder:https://github.com/codebude/QRCoder/

QRCoder是一個簡單的庫,用C#.NET編寫,能夠建立QR碼,沒有與其餘的庫有任何依賴關係, 引用就一個幾百kb的dll,而且效率還不錯。

引入

新建一個winform項目,而後從nuget上引入便可

而後再引入命名空間

複製代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using QRCoder; //就是它,沒有多餘的
複製代碼

建立第一張二維碼

在GayHub上,QRCoder的readme已經介紹過了,只要4行簡單的代碼,就能夠完成二維碼生成了。

QRCodeGenerator qrGenerator = new QRCodeGenerator();
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = qrCode.GetGraphic(20);

不過這裏作了一個簡單的winform來使用它,

複製代碼
private void CreateQR(int pixelsPerModule, string info, Color qrColor, Color qrBackgroundColor, Bitmap logo, int iconSizePercent = 15, int iconBorderWidth = 6)
{
    QRCodeGenerator qrGenerator = new QRCodeGenerator();
    QRCodeData qrCodeData = qrGenerator.CreateQrCode(info, QRCodeGenerator.ECCLevel.Q);
    QRCode qrCode = new QRCode(qrCodeData);
    Bitmap qrCodeImage = qrCode.GetGraphic(pixelsPerModule, qrColor, qrBackgroundColor, logo, iconSizePercent, iconBorderWidth, true);
    picBoxQRCode.Image = qrCodeImage;
}

private void CreateQR(int pixelsPerModule, string info, Color qrColor, Color qrBackgroundColor)
{
    QRCodeGenerator qrGenerator = new QRCodeGenerator();
    QRCodeData qrCodeData = qrGenerator.CreateQrCode(info, QRCodeGenerator.ECCLevel.Q);
    QRCode qrCode = new QRCode(qrCodeData);
    Bitmap qrCodeImage = qrCode.GetGraphic(pixelsPerModule, qrColor, qrBackgroundColor, true);
    picBoxQRCode.Image = qrCodeImage;
}
複製代碼

界面效果:

 

QRCoder還有許多設置,根據不一樣須要來傳入不一樣參數便可。

文章中的Demo代碼很簡單,你們借鑑參考玩玩,歡迎你們來到GayHub交流:https://github.com/EminemJK/QRCodeForm

.Net生態社區但願愈來愈壯大,不斷有優秀的開源組件的加入。

 

 

 

 

 

 

Asp.net MVC 中 CodeFirst 開發模式實例

 

  昨天寫的這篇博客由於下班時間到了忘記保存了,好鬱悶,得從新寫一遍。實習所在公司使用的是CodeFirst開發模式,最近開始參與到公司的項目裏面來了,發現這個模式特別好用,建庫建表改變字段屬性添加刪除字段等等操做都無需本身在數據庫動手操做,只須要編寫代碼便可實現,着實是方便了許多。今天來記錄一下如何使用CodeFirst開發模式,閒言少敘,下面進入正題。

(一)準備工做

  新建三個項目,其中一個爲MVC項目(Console),另外兩個爲類庫項目(Moel和ORM),三者用途以下:

Console:這個就不說了;

Model:這個項目裏專門書寫數據實體類;

ORM:這個項目用來建立上下文,構建數據庫與實體類之間的映射關係;

以下圖所示:

(二)在Model中添加實體類User.cs

代碼以下:

複製代碼
namespace Model
{

    [Table("Sys_User")] //自動建表的表名
    public class User
    {
        /// <summary>
        /// 主鍵
        /// </summary>
        [Key]
        public Guid Id { get; set;}
        /// <summary>
        /// 登陸名
        /// </summary>
        [Required] //必填項(非空)
        [MaxLength(50)] //最大長度(50)
        public string LoginName { get; set;}

        /// <summary>
        /// 密碼
        /// </summary>
        [Required]
        [MaxLength(50)]
        public string Password { get; set; }

        /// <summary>
        /// 性別
        /// </summary>
        [Required]
        public bool Gender { set; get; }

        /// <summary>
        /// 是否啓用
        /// </summary>
        [Required]
        public bool IsEnable { get; set; }

        /// <summary>
        /// 真實姓名
        /// </summary>
        [MaxLength(50)]
        public string RealName { get; set; }

        [MaxLength(300)]
        public string Remark { get; set; }

        /// <summary>
        /// 建立時間
        /// </summary>
        public DateTime CreateTime { get; set; }

    }
}
複製代碼

 

(三)在ORM中書寫上下文,創建映射關係

1.在ORM中利用Nuget工具添加EF包:

2.新建類文件,添加以下代碼:

複製代碼
namespace ORM
{
    public class MyDbContext : DbContext
    {
        public MyDbContext()
           : base(GetConnectionString()) { }

        private static string GetConnectionString()
        {
            return "SqlServerConnectionString";
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }

        public DbSet<User> Users { get; set; }//創建實體類與表的映射關係
    }
}
複製代碼

 

上面的構造函數public MyDbContext():base("XXX"){},這個xxx位置填寫的是你在配置文件裏配置數據庫連接的連接名,上面代碼我寫的是  SqlServerConnectionString。

(四)在配置文件中配置數據庫鏈接字符串 SqlServerConnectionString

  首先,一樣要用nuget工具將EF添加到 Console中,而後,在代碼中以下位置添加鏈接字符串:

須要注意的是:

<connectionStrings> 加到<configSections></configSections>的後面,不要加到前面去了,不然可能會出問題哦!

 代碼以下:

  <connectionStrings>
    <add name="SqlServerConnectString" providerName="System.Data.SqlClient" connectionString="Server=localhost;Database=CodeFirstDb;Integrated Security=False;User ID=sa;Password=168168;" /
  </connectionStrings>

 

 鏈接字符串裏的內容就很少說了,這裏的數據庫也會自動生成,不用本身手動去建庫。

配置完ConnectionString後,記得要把System.Configuration這個引用添加到ORM項目中。

(五)數據遷移Migration (將Model的修改應用到數據庫中,且不會改變對應的表中的原始數據)

在ORM項目中,打開nuget管理工具的控制檯模式

 

而後輸入指令:Enable-Migration:

 

 完成此步後,咱們能夠看到,ORM中多了一個文件夾,裏面有以下的內容:

下面對Configuration.cs裏的內容進行更改:

 

改動點見上圖。

(六)在Application_Start事件中初始化數據庫策略

  打開Console中的global.aspx文件,找到Application_Start事件,添加以下代碼:

 //當提供了初始化數據時,使用該形式,以初始化數據庫策略並填充一些數據(當某個Model改變了,就刪除原來的數據庫建立新的數據庫)
 Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext,ORM.Migrations.Configuration>()); 

以下圖所示:

(七)在Console新建控制器,實現一個對User表的簡單應用

前面6步作好了,就基本大功告成了,下面驗證一下,有沒有自動生成數據庫。

在控制器中添加控制器,直接選自動生成增刪改查功能的模板,以下所示:

這樣就自動生成了一些關於User的功能,咱們打開這一頁面,能夠看到:

這裏的一組數據是我加上去的,若是是首次運行,這裏沒有數據,只會顯示這一排字段。

下面看一下個人數據庫

這個數據庫已經生成了,要知道我以前是並無建這個庫和表的。

 下面,我將User.cs中的Remark實體刪除,看看數據庫中有何變化:

而後再次運行程序:

結果是這樣的:

哦。。。。哦。。尷尬了啊,他禁止了個人數據遷移,說由於這會形成數據丟失,怎麼辦呢。好辦,只須要在ORM下的Configuration.cs中添加以下代碼便可解決:

 // 自動遷移時若是引發數據丟失是否可接受
  AutomaticMigrationDataLossAllowed = true;

 

看圖:

而後我再運行一下代碼:

再查看數據庫:

看數據庫,咱們的Remark字段已經不見了。

由於缺乏這個字段,因此在進行增刪改查功能是會出錯:

這是因爲咱們原來生成的View中有這個字段,如今實體類裏這個字段刪除了,而view頁面中沒刪除形成的,只須要本身去把與Remark相關的字段刪除就能夠正常運行的。

下面,我再把這個Remark字段加上去,看看結果。

 

結果爲:

看看數據庫:

關於其餘的新建表,添加字段等等功能,都是適用的,這裏我就再一 一演示了。

 

好了,這篇就寫到這裏了哦,但願能幫到你!加油!

大佬看到了 ,也但願指點一下,感激涕零!

相關文章
相關標籤/搜索