C#winform解析marc顯示在datagridview中以及marc卡片顯示

来源:http://www.cnblogs.com/luoxiaozhao/archive/2016/01/16/5135045.html
-Advertisement-
Play Games

結果顯示:marc顯示:卡片顯示:程式一個類: public class MARC { #region 界面上要顯示的元素 public string ztm = "";//正題名 public string ftm = "";//副題名 ...


結果顯示:marc顯示:

卡片顯示:

程式一個類:

public class MARC
{
#region 界面上要顯示的元素

public string ztm = "";//正題名
public string ftm = "";//副題名
public string fcm = "";//分冊(輯)名
public string fch = "";//分冊(輯)號
public string dyzrsm = "";//第一責任說明

public string zyzrz_1_lb = "";//主要責任者1,類別,個人/團體/會議
public string zyzrz_1_mc = "";//主要責任者1,名稱
public string zyzrz_1_zzfs = "";//主要責任者1,著作方式

public string zyzrz_2_lb = "";//主要責任者2,類別,個人/團體/會議
public string zyzrz_2_mc = "";//主要責任者2,名稱
public string zyzrz_2_zzfs = "";//主要責任者2,著作方式

public string cyzrz_1_lb = "";//次要責任者1,類別,個人/團體/會議
public string cyzrz_1_mc = "";//次要責任者1,名稱
public string cyzrz_1_zzfs = "";//次要責任者1,著作方式

public string cyzrz_2_lb = "";//次要責任者2,類別,個人/團體/會議
public string cyzrz_2_mc = "";//次要責任者2,名稱
public string cyzrz_2_zzfs = "";//次要責任者2,著作方式

public string bc = "";//版次
public string isbn = "";//ISBN
public string zz = "";//裝幀
public string dj = "";//單價
public string yzdm = "";//語種代碼
public string csm = "";//叢書名/叢編題名
public string cb_jcbs = "";//叢編_捲冊標識
public string fcbmc = "";//分叢編名稱
public string cbd = "";//出版地
public string cbz = "";//出版者
public string cbrq = "";//出版日期
public string ys = "";//頁數
public string tu = "";//圖
public string cc = "";//尺寸
public string fj = "";//附件
public string fzx = "";//附註項
public string flh = "";//分類號,可能有多個,文本框中只顯示第一個
public string zch = "";//種次(著者)號
public string jqh = "";//捲期號
public string ndh = "";//年代號
public string pjqf = "";//排架區分
public string zy = "";//摘要
public string ztc = "";//主題詞,可能有多個
public string bgdm = "";//本館代碼
public string rdrq = "";//入檔日期
public string sbmy = "";//首編目員
//這個要傳回來
public string dlh = "";//登錄號,可能有多個

#endregion 顯示MARC


private string GetIndexChar(int index)
{
switch (index)
{
case 0:
return "①";
case 1:
return "②";
case 2:
return "③";
case 3:
return "④";
case 4:
return "⑤";
case 5:
return "⑥";
case 6:
return "⑦";
case 7:
return "⑧";
case 8:
return "⑨";
case 9:
return "⑩";
}
return "";
}
/// <summary>
/// 卡片顯示
/// </summary>
/// <param name="marcStr"></param>
/// <returns></returns>
public Bitmap GetMarcPic()
{

//this.pic_KP.Image = null;
Bitmap bmpTemp = new Bitmap(474, 283 * 2);
Graphics g = Graphics.FromImage(bmpTemp);
//畫背景
g.FillRectangle(Brushes.White, new Rectangle(0, 0, bmpTemp.Width, bmpTemp.Height));
//分類號
g.DrawString(flh.Split(' ')[0], new Font("宋體", 10, FontStyle.Bold), Brushes.Black, new Point(20, 40));//只畫第一個分捲號
//種次號
g.DrawString(zch, new Font("宋體", 10, FontStyle.Bold), Brushes.Black, new Point(20, 56));
//捲期號
g.DrawString(jqh, new Font("宋體", 9), Brushes.Black, new Point(20, 72));
//段落1
string strToDraw = " " + ztm;//正題名
strToDraw += ftm == "" ? "" : ("." + ftm);//副題名
strToDraw += fcm == "" ? "" : ("." + fcm);//分冊名
strToDraw += fch == "" ? "" : ("." + fch);//分冊號
strToDraw += dyzrsm == "" ? "" : ("/" + dyzrsm);//第一責任說明
strToDraw += bc + cbd == "" ? "" : (".—" + bc);//出版地
strToDraw += bc + cbd == "" ? "" : ("." + cbd);//出版地
strToDraw += cbz == "" ? "" : (":" + cbz);//出版者
strToDraw += cbrq == "" ? "" : ("." + cbrq);//出版日期
//段落2
strToDraw += "\r\n " + ys;//頁數
strToDraw += tu == "" ? "" : (":" + tu);//圖
strToDraw += cc == "" ? "" : (";" + cc);//尺寸
strToDraw += fj == "" ? "" : (";" + fj);//附件
if (csm != "")
{
strToDraw += ".—(" + csm;//叢編題名
strToDraw += cb_jcbs == "" ? "" : ("." + cb_jcbs);//叢編_捲冊標識
strToDraw += fcbmc == "" ? "" : ("." + fcbmc);//分叢編名稱
strToDraw += ")";
}
//段落3
strToDraw += "\r\n\r\n\r\n\r\n";
if (zy != "")
{
strToDraw += " " + zy + "\r\n\r\n";//摘要
}
if (isbn != "")
{
strToDraw += " ISBN: " + isbn;//ISBN
if (dj != "")
{
strToDraw += ":" + dj;//單價
}
strToDraw += "\r\n\r\n";
}
//段落4
strToDraw += " ";
if (ztm != "")//主題名
{
strToDraw += "Ⅰ." + ztm.Replace("(", "").Replace("(", "").Replace("《", "").Substring(0, 1) + "... ";
}
//作者
List<string> allWriter = new List<string>();
if (zyzrz_1_mc != "")
{
allWriter.Add(zyzrz_1_mc);
}
if (zyzrz_2_mc != "")
{
allWriter.Add(zyzrz_2_mc);
}
if (cyzrz_1_mc != "")
{
allWriter.Add(cyzrz_1_mc);
}
if (cyzrz_2_mc != "")
{
allWriter.Add(cyzrz_2_mc);
}
if (allWriter.Count == 1)
{
strToDraw += "Ⅱ.";
strToDraw += allWriter[0].Replace("(", "").Replace("(", "").Replace("《", "").Substring(0, 1) + "... ";//只有1個作者
}
else if (allWriter.Count > 1)
{
strToDraw += "Ⅱ.";
//多個作者,給出編號
for (int i = 0; i < allWriter.Count; i++)
{
strToDraw += GetIndexChar(i) + allWriter[i].Replace("(", "").Replace("(", "").Replace("《", "").Substring(0, 1) + "... ";
}
}
//主題詞
List<string> ztcList = ztc.Split(new char[] { (char)29 }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (ztcList.Count == 1)
{
strToDraw += "Ⅲ.";
strToDraw += ztcList[0].ToString() + " ";//只有1個主題詞
}
else if (ztcList.Count > 1)
{
strToDraw += "Ⅲ.";
//多個主題詞,給出編號
for (int i = 0; i < ztcList.Count; i++)
{
strToDraw += GetIndexChar(i) + ztcList[i] + " ";
}
}
//分類號
List<string> flhList = flh.Split(new char[] { (char)29 }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (flhList.Count == 1)
{
strToDraw += "Ⅳ.";
strToDraw += flhList[0].ToString();//只有分類號
}
else if (flhList.Count > 1)
{
strToDraw += "Ⅳ.";
//多個分類號,給出編號
for (int i = 0; i < flhList.Count; i++)
{
strToDraw += GetIndexChar(i) + flhList[i] + " ";
}
}
//登錄號
int dlcount = 0;
Font font = new Font("新宋體", 9, FontStyle.Bold);
foreach (string dl in dlh.Split(new char[] { (char)29 }, StringSplitOptions.RemoveEmptyEntries))
{
if (dl.Trim() == "")
{
continue;
}
g.DrawString(dl, font, Brushes.Black, new Point(20, 124 + dlcount * 16));
dlcount++;
}
//底部圓圈
g.DrawEllipse(Pens.Black, new Rectangle(bmpTemp.Width / 2 - 4, bmpTemp.Height / 2 - 24, 16, 16));
//畫卡片詳細
StringFormat sf = new StringFormat();
sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.DisplayFormatControl;
sf.Trimming = StringTrimming.EllipsisCharacter;
//sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
//sf.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.DisplayFormatControl;
//SizeF sizef = g.MeasureString(strToDraw, this.Font, 300, sf);
int charactersFitted = 0;//能容納的字元數
int linesFilled = 0;//能容納的行數,最多16行
SizeF sizef = g.MeasureString(strToDraw, font, new SizeF(300, 220), sf, out charactersFitted, out linesFilled);

if (charactersFitted < strToDraw.Length)
{
//需要分頁
g.DrawString("1/2", font, Brushes.Black, new Point(360, 13));
g.DrawString("2/2", font, Brushes.Black, new Point(360, 13 + bmpTemp.Height / 2));
g.DrawString("(見次卡)", font, Brushes.Black, new Point(325, 260));

g.DrawEllipse(Pens.Black, new Rectangle(bmpTemp.Width / 2 - 4, bmpTemp.Height - 24, 16, 16));
g.DrawLine(Pens.Black, new Point(0, bmpTemp.Height / 2), new Point(bmpTemp.Width, bmpTemp.Height / 2));

g.DrawString(strToDraw.Substring(0, charactersFitted + 1), font, Brushes.Black, new RectangleF(new Point(120, 40), g.MeasureString(strToDraw, font, 300, sf)), sf);
g.DrawString(strToDraw.Substring(charactersFitted + 1), font, Brushes.Black, new RectangleF(new Point(120, 40 + bmpTemp.Height / 2), g.MeasureString(strToDraw, font, 300, sf)), sf);


//this.pic_KP.Image = bmpTemp;
return bmpTemp;
}
else
{
g.DrawString(strToDraw, font, Brushes.Black, new RectangleF(new Point(120, 40), sizef), sf);
Bitmap picToShow = new Bitmap(bmpTemp.Width, bmpTemp.Height / 2);
Graphics gp = Graphics.FromImage(picToShow);
gp.DrawImageUnscaled(bmpTemp, 0, 0, bmpTemp.Width, bmpTemp.Height / 2);
return picToShow;
//this.pic_KP.Image = picToShow;
}
}

 

/// <summary>
/// MARC顯示
/// </summary>
/// <param name="marcStr"></param>
/// <param name="todgv"></param>
public void ShowMarcTable(string marcStr, DataGridView todgv)
{
if (string.IsNullOrWhiteSpace(marcStr))
{
return;
}
DBUtility.SQuery sq = DBUtility.SQuery.Create("SELECT * FROM MARC數據字典 WHERE MARC類型=1 ORDER BY 標識符");//MARC類型=1為CNMARC,0為USMARC
DataTable dt = DBUtility.DbHelper.ExecuteDataTable(sq.ToString());
DataTable marcTable = new DataTable();
marcTable.Columns.Add("欄位名稱");
marcTable.Columns.Add("標識");
marcTable.Columns.Add("指");
marcTable.Columns.Add("欄位內容");
List<string> arr = marcStr.Split((char)30).ToList();
if (arr.Count == 0)
{
throw new Exception("MARC無效");
}
marcTable.Rows.Add("頭標區", "", "", arr[0].Trim());
arr.RemoveAt(0);
//這裡要進行篩選,把空的元素直接刪除,因為在進行直接操作刪除時候會報錯
if (arr[arr.Count - 1].ToString() == "")
{
arr.RemoveAt(arr.Count-1);
}
foreach (string str in arr)
{
if (str == "")
{
continue;
}
string key = str.Substring(0, 3);
DataRow[] dr = dt.Select(string.Format("標識符='{0}'", key));
if (dr.Length > 0)
{
int len = int.Parse(dr[0]["固定長度"].ToString());
if (len > 0)
{
//判斷是否包含特殊字元
if (str.Contains((char)31))
{
marcTable.Rows.Add(dr[0]["名稱縮寫"].ToString(), key,
"", str.Substring(str.IndexOf((char)31)).Trim().Replace((char)31, '■'));
}
else
{
marcTable.Rows.Add(dr[0]["名稱縮寫"].ToString(), key, "", str.Substring(3).Trim());//原來的沒把特殊字元轉化為■
}
if (key == "005")//處理日期特殊處理
{
rdrq = str.Substring(3, 8);//國定長度,無子項
}
}
else
{
if (str.IndexOf((char)31) == -1)
{
marcTable.Rows.Add(dr[0]["名稱縮寫"].ToString(), key, "", str.Substring(3).Trim());
continue;
}
marcTable.Rows.Add(dr[0]["名稱縮寫"].ToString(), key,
str.Split((char)31)[0].Substring(3).Trim(), str.Substring(str.IndexOf((char)31)).Trim().Replace((char)31, '■'));

string[] subArray = str.Substring(str.IndexOf((char)31)).Trim().Split(new char[] { (char)31 }, StringSplitOptions.RemoveEmptyEntries);
switch (key)
{
//case "005"://處理時間,固定長度,特殊處理
// rdrq = subArray[0].Substring(0, 8);//國定長度,無子項
// break;
case "010"://ISBN
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://ISBN
isbn = subStr.Substring(1);
break;
case "b"://裝幀
zz = subStr.Substring(1);
break;
case "d"://單價
dj = subStr.Substring(1);
break;
}
}
break;
case "101"://作品語種
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://語種代碼
yzdm = subStr.Substring(1);
break;
}
}
break;
case "200"://題名責任
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://正題名
ztm = subStr.Substring(1);
break;
case "e"://副題名
ftm = subStr.Substring(1);
break;
case "i"://分冊(輯)名
fcm = subStr.Substring(1);
break;
case "h"://分冊(輯)號
fch = subStr.Substring(1);
break;
case "f"://第一責任說明
dyzrsm = subStr.Substring(1);
break;
}
}
break;
case "205"://版次
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://版本說明
bc = subStr.Substring(1);
break;
}
}
break;
case "210"://出版發行
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://出版地
cbd = subStr.Substring(1);
break;
case "c"://出版者
cbz = subStr.Substring(1);
break;
case "d"://出版日期
cbrq = subStr.Substring(1);
break;
}
}
break;
case "215"://載體形態
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://頁數
ys = subStr.Substring(1);
break;
case "c"://圖
tu = subStr.Substring(1);
break;
case "d"://尺寸
cc = subStr.Substring(1);
break;
case "e"://附件
fj = subStr.Substring(1);
break;
}
}
break;
case "225"://叢編項
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://叢書名
csm = subStr.Substring(1);
break;
case "v"://叢編_捲冊標識
cb_jcbs = subStr.Substring(1);
break;
case "i"://分叢編名稱
fcbmc = subStr.Substring(1);
break;
}
}
break;
case "300"://一般附註
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://附註
fzx = subStr.Substring(1);
break;
}
}
break;
case "330"://提要文摘
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://摘要
zy = subStr.Substring(1);
break;
}
}
break;
case "606"://普通主題
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://主題詞,可能有多個,用空格隔開
ztc += subStr.Substring(1) + (char)29;
break;
}
}
break;
case "690"://中圖分類
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://分類號,可能有多個,用空格隔開
flh += subStr.Substring(1) + (char)29;
break;
}
}
break;
case "701"://人名等同
case "711"://團體等同
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a":
if (zyzrz_1_mc == "")
{
if (key == "701")
{
zyzrz_1_lb = "個人";
}
else
{
string zhi = str.Split((char)31)[0].Substring(3).Trim();
zyzrz_1_lb = zhi.Length > 0 && zhi[0].ToString() == "1" ? "會議" : "團體";//"指"的第一位為1表示會議,否則為團體
}
zyzrz_1_mc = subStr.Substring(1);
}
else
{
if (key == "701")
{
zyzrz_2_lb = "個人";
}
else
{
string zhi = str.Split((char)31)[0].Substring(3).Trim();
zyzrz_2_lb = zhi.Length > 0 && zhi[0].ToString() == "1" ? "會議" : "團體";//"指"的第一位為1表示會議,否則為團體
}
zyzrz_2_mc = subStr.Substring(1);
}
break;
case "4":
if (zyzrz_1_mc != "" && zyzrz_1_zzfs == "")
{
zyzrz_1_zzfs = subStr.Substring(1);
}
else
{
zyzrz_2_zzfs = subStr.Substring(1);
}
break;
}
}
break;
case "702"://人名次要
case "712"://團體次要
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a":
if (cyzrz_1_mc == "")
{
if (key == "702")
{
cyzrz_1_lb = "個人";
}
else
{
string zhi = str.Split((char)31)[0].Substring(3).Trim();
cyzrz_1_lb = zhi.Length > 0 && zhi[0].ToString() == "1" ? "會議" : "團體";//"指"的第一位為1表示會議,否則為團體
}
cyzrz_1_mc = subStr.Substring(1);
}
else
{
if (key == "702")
{
cyzrz_2_lb = "個人";
}
else
{
string zhi = str.Split((char)31)[0].Substring(3).Trim();
cyzrz_2_lb = zhi.Length > 0 && zhi[0].ToString() == "1" ? "會議" : "團體";//"指"的第一位為1表示會議,否則為團體
}
cyzrz_2_mc = subStr.Substring(1);
}
break;
case "4":
if (cyzrz_1_mc != "" && cyzrz_1_zzfs == "")
{
cyzrz_1_zzfs = subStr.Substring(1);
}
else
{
cyzrz_2_zzfs = subStr.Substring(1);
}
break;
}
}
break;
case "830"://編目員註釋
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://此項不確定//??
sbmy = subStr.Substring(1);
break;
}
}
break;
case "905"://館藏信息
foreach (string subStr in subArray)
{
switch (subStr.Substring(0, 1))
{
case "a"://館藏代碼
bgdm = subStr.Substring(1);
break;
case "b"://登錄號
dlh += subStr.Substring(1) + (char)29;
break;
case "c"://排架區分
pjqf = subStr.Substring(1);
break;
//case "d"://分類號
// flh += subStr.Substring(1) + (char)29; //等同於 690-a
// break;
case "e"://分種次號
zch = subStr.Substring(1);
break;
case "v"://捲期號
jqh = subStr.Substring(1);
break;
case "y"://年代號
ndh = subStr.Substring(1);
break;
}
}
break;
}
}
}
else
{
//099未識別
//throw new Exception(string.Format("未識別的MARC標記:{0}", str.Substring(0, 3)));
}
}
todgv.DataSource = marcTable;
todgv.Columns["欄位名稱"].Width = 80;
todgv.Columns["標識"].Width = 40;
todgv.Columns["指"].Width = 40;
todgv.Columns["欄位內容"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
todgv.Columns["欄位內容"].Width = Math.Max(50, todgv.Width - 80 - 40 - 40 - 20);
todgv.Columns["欄位名稱"].DefaultCellStyle.BackColor = Color.LightGray;
todgv.Columns["欄位名稱"].DefaultCellStyle.ForeColor = Color.SteelBlue;
todgv.Columns["欄位名稱"].DefaultCellStyle.Font = new Font("宋體", 9);

todgv.Columns["標識"].DefaultCellStyle.ForeColor = Color.Red;
todgv.Columns["指"].DefaultCellStyle.ForeColor = Color.Red;

todgv.Columns["欄位內容"].DefaultCellStyle.Font = new Font("新宋體", 13);
//FontStyle fs = this.dgv_MARC.Font.Style;
//fs |= FontStyle.Bold;
//Font ft = new Font("宋體", 12, fs);

//this.dgv_MARC.Columns[3].DefaultCellStyle.Font = ft;
todgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
}

internal void ShowMarcTable(object marc_fz, DataGridView dgv_MARC)
{
throw new NotImplementedException();
}
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接地址:http://www.cnblogs.com/lyhabc/p/3888702.html 最近把大學時候的ORACLE教程書本翻出來看,真的是感觸良多 以前在學校的時候,每次ORACLE測驗和考試都是不合格的,期末的時候靠補考才勉強過關 大家看到下圖的封面應該知道大學教我們ORACLE...
  • 問題描述: 工作中使用kettle將原始庫中的數據抽取到標準庫中,在抽取過程中報錯:【ORA-14400: 插入的分區關鍵字未映射到任何分區】解決過程: 經過百度,發現出現ORA-14400是表分區出現問題。 1.確定該表是否已經添加了表分區。 select partition_na...
  • 本文主要含有一些AlwaysOn 配置方法及連接。本想展開詳細寫一下 無奈隔壁在年會排練節目,那歌唱得我只想趕緊回家!!!!!!!!!!!!!!!http://www.cnblogs.com/double-K/------------------------------只讀配置-----------...
  • 背景《SQL Server 2012實施與管理實戰指南》中指AlwaysON同步過程如下:任何一個SQL Server里都有個叫Log Writer的線程,當任何一個SQL用戶提交一個數據修改事務時,它會負責把記錄本次修改的日誌信息先記入一段記憶體中的日誌緩衝區,然後再寫入物理日誌文件(日誌固化)。所...
  • 今天在維護oracle資料庫時,查看監聽的狀態,執行#lsnrctl status報錯: -bash:lsnrctl:command not found。以前並不會這樣,仔細想了一下,問題找到了,我是以root遠程登錄到伺服器上,維護oracle時,直接 su oracle,這樣操作雖然用戶切換為o...
  • 相信很多博友在開發初次接觸學習C# winForm時,當窗體大小變化時,窗體內的控制項並沒有隨著窗體的變化而變化,最近因為一個項目工程的原因,也需要解決這個問題。通過查閱和學習,這個問題得到瞭解決,或許不是很好的處理方式,但是也值得借鑒。。。 下麵我將建立一個Demo來大概解釋下這個方法的實現:(註:...
  • public class WaitQueue : IDisposable where T : class { /// /// The deal action. /// public Action DealActio...
  • 因為框架使用了字體文件來顯示矢量的圖標,為了能在IIS上正常顯示圖標,可以通過增加iis的MIME-TYPE來支持圖標字體文件:增加以下兩種文件類型即可:.woff application/x-woff.svg image/svg+xml最後還可以查看樣式是否有發佈進去,如果沒有直接把樣式考進去覆蓋...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...