2019/7/2

如何以C#將DataTable轉成html?


        private string ExportHtml(DataTable dt)
        {
            StringBuilder strHTMLBuilder = new StringBuilder();
            strHTMLBuilder.Append("");
            strHTMLBuilder.Append("");
            strHTMLBuilder.Append("
");            strHTMLBuilder.Append("");
            strHTMLBuilder.Append("
");


            strHTMLBuilder.Append(" ");
            foreach (DataColumn myColumn in dt.Columns)
            {
                strHTMLBuilder.Append("
");

                strHTMLBuilder.Append(myColumn.ColumnName);
                strHTMLBuilder.Append("
");
            }
            strHTMLBuilder.Append("
");

            foreach (DataRow myRow in dt.Rows)
            {

                strHTMLBuilder.Append(" ");
                foreach (DataColumn myColumn in dt.Columns)
                {
                    strHTMLBuilder.Append("
");

                    strHTMLBuilder.Append(myRow[myColumn.ColumnName].ToString());
                    strHTMLBuilder.Append("
");
                }
                strHTMLBuilder.Append("
");            }

            //Close tags.
            strHTMLBuilder.Append("
");            strHTMLBuilder.Append("
");            strHTMLBuilder.Append("
");
            string Htmltext = strHTMLBuilder.ToString();

            return Htmltext;

        }

由string反序列化Json物件的方法

1. 透過http://json2csharp.com/ 直接貼上json語法,會產生對應的C#物件。

2. using Newtonsoft.Json;

3. 以 JsonConvert.DeserializeObject 將 string反序列化Json物件成為C#內的物件
    在整理成DataTable 後,轉成html

private void parseJson(string json)
        {
            //ReadFromFile();           
            RootObject rootObject = JsonConvert.DeserializeObject(json);
            int days = rootObject.days;
            //MessageBox.Show("共" + days + "筆資料");

            DataTable newDt = new DataTable();
            newDt.Columns.Add("column1", typeof(string));
            newDt.Columns.Add("column2", typeof(string));           
            newDt.Columns.Add("column3", typeof(string));
            newDt.Columns.Add("column4", typeof(string));
            newDt.Columns.Add("column5", typeof(string));
           

            int i = 0;
            while (++i <= days)
            {
                newDt.Columns.Add(i.ToString(), typeof(string));
            }

            //rootObject.aaData.Sort(CompareFloat);   
           
            foreach (DataRow row in rootObject.aaData.Rows)
            {
                //MessageBox.Show(row["id"] + " - " + row["item"]);               
                if ( !row["score_0"].Equals("100.0000"))
                {
                    DataRow workRow;

                    workRow = newDt.NewRow();
                    workRow[0] = row["eDeskId"];
                    workRow[1] = row["systemName"];
                    workRow[2] = "";
                    workRow[3] = row["keySystem"];

                    for (i = 0; i <= days; i++)
                    {
                        string score = row["score_" + i].ToString();

                        if( score.Equals("100.0000") )
                        {
                            workRow[i + 4] = "100";;
                        }
                        else
                        {
                            redCount++;
                            workRow[i + 3] = "" + row["score_" + i] + "";
                        }                       
                    }

                    newDt.Rows.Add(workRow);
                }
            }
                       
            stringHtml = ExportHtml(newDt);

            textBox2.Text = stringHtml;

            htmlFileName = "qos_" + DateTime.Now.Month + "_" + DateTime.Now.Day + ".html";
            StreamWriter sw = new StreamWriter(workDir + @"\" + htmlFileName, true, Encoding.Default);           
            sw.Write(stringHtml);
            sw.Close();

            StreamWriter sw2 = new StreamWriter(workDir + @"\redCount.txt", true, Encoding.Default);
            sw2.Write(Convert.ToString(redCount));
            sw2.Close();
        }

C#.net 用webbrowser類別自動抓取網頁程式


用webbrowser類別自動抓取網頁程式

        protected void button1_Click(object sender, EventArgs e)
        {

            if (textBox1.Text == "" || textBox1.Text == "https://")
            {
                textBox1.Text = "https://qos.cht.com.tw";
            }

            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

            Navigate(textBox1.Text);



/// 確認網頁是否讀取完畢的方法

private bool checkComplete(string keyword)
        {
            bool b = false;

            while (!b)
            {
                if (webBrowser1.Document != null)
                {
                    foreach (HtmlElement he in webBrowser1.Document.All)
                    {
                        //if(he.Id.Contains(keyword) )
                        if (he.Id == keyword)
                        //if (he.OuterText == keyword)
                        {
                            b = true;
                        }
                    }
                }
                Application.DoEvents();
            }

            return b;
        }



       private bool checkComplete2(string keyword)
        {
            bool b = false;

            while (!b)
            {
                if (webBrowser1.Document != null)
                {
                    foreach (HtmlElement he in webBrowser1.Document.All)
                    {
                        //MessageBox.Show("]" + he.OuterHtml + "[");
                        if(he.OuterHtml.Contains(keyword) )
                        //if (he.OuterHtml == keyword)
                        //if (he.OuterText == keyword)
                        {
                            b = true;
                        }
                    }
                }
                Application.DoEvents();
            }

            return b;
        }

如何在C#.net中加入元件


/// 在類別內加入一個data member,並馬上new物件,呼叫建構子。
partial class Form1 : Form
    {

        private Button button1 = new Button();


///建構子中設定物件屬性
public Form1()
        {
            button1.Location = new Point(10, 10);
            button1.TabIndex = 0;
            button1.Text = "Navigate Qos";
            button1.AutoSize = true;
            button1.Click += new EventHandler(button1_Click);

            ///最後加入Control中
            this.Controls.Add(button1);


2019/6/12

首篇 KZ AS10 五單動鐵高解析度入耳式耳機 開箱評測

首篇 KZ AS10 五單動鐵高解析度入耳式耳機 開箱評測


[前言]


動鐵又稱「平衡電樞」(Balanced Armature),也是助聽器中的必要元件,所以也有助聽器廠商轉作動鐵耳機的。由於其極高的驅動效率,故瞬態響應能力極強,聲音密度也大,加上體積極小,成為入耳式耳塞的微型腔體的優異選項之一,故現在越來越多的入耳式耳機採用了動鐵做為發聲單元。

此番入手一支KZ AS10 五單動鐵高解析度入耳式耳機,上網搜尋一下機體資料,發現居然沒有繁體中文的評測,我想這大概是繁中的第一篇評測文吧?規格也只有英文。




[產品開箱]


▲ KZ AS10 五單動鐵高解析度入耳式耳機外盒正面。

▲ KZ AS10 五單動鐵高解析度入耳式耳機的包裝採夾層式設計,第一個夾層有海綿隔層,簡單展現左右聲道耳機與金屬銘片。
▲ 內部夾層則放置所有配件與文件。



▲ KZ AS10 五單動鐵高解析度入耳式耳機具備5平衡電樞驅動器與0.75mm雙PIN。

▲ KZ AS10 五單動鐵高解析度入耳式耳機所有配備一覽,除了出廠掛上的中型耳塞之外,另外還附上大型與小型耳塞。


▲ KZ AS10 五單動鐵高解析度入耳式耳機也具備有線控器。


▲ KZ AS10 五單動鐵高解析度入耳式耳機既然有線控器,插頭部分想當然爾也是三級式設計,線材採高質感編織設計。


[耳機試聽]

▲ 遊戲BMG測試標的同樣來自傳說對決,評測耳機不想花時間玩遊戲的人可以直接打開音訊檔案測試。

FANTECH HG11 CAPTAIN 7.1耳罩式電競耳機評測傳說對決
▲ 音樂測試標的物同樣來自筆者的YOUTUBE歌單。


[使用心得]


KZ AS10 五單動鐵高解析度入耳式耳機在價格上還沒破2K NTD,ALI上賣66 USD,淘寶則賣¥399,在此價位帶上的耳機,能夠買到五單動鐵高解析度入耳式耳機實在讓人感動,AS 10在外型上找到KZ自己的一套設計風格,藍色半透明的腔體,可以清楚看到背部結構,具備了滿滿的科技感。

動鐵式耳機所需具備的特點,如:高靈敏度、瞬態能力強、高聲音密度在KZ AS10 五單動鐵高解析度入耳式耳機都可以發現。動鐵本身體積小,但用上五單動鐵的KZ AS10卻因為大數量的動鐵使得腔體變大。

瞬態能力強可以再電子音樂中測試得到,我用月風魔傳來測試可以感受到音量急遽由低往上拉的氣勢,泛音上也有所表現。完整的低頻下潛可由頻率測試視頻中得到驗證,幾乎可以完整聽到最低頻率,強烈的重低音同樣可以從Gundam Banshee的前奏中得到體現,如果是其他太差勁的耳機喇吧式聽不大見這段鼓聲的,這首音樂同時也能測試KZ AS10的分離度與高解析度空間感則較偏於腦門後方。求佛中可以聽到有別一般PC喇叭的樂器泛音尾韻與左右音場。

進行傳說對決遊戲時可以感受到有別於手機喇叭的震撼力與空間臨場感,入耳式耳機的體積更適合通勤時配戴,在捷運上網玩幾場傳說對決就靠它了。。

以上小小的使用心得,初步使用覺得KZ AS10 五單動鐵高解析度入耳式耳機的音質完全是筆者的菜,會馬上上位成正宮,成為目前主力耳機,建議不滿意目前手頭耳機與手機喇叭的消費者可以入手。