C# จะเรียกใช้ method ในโค้ด ขณะ รันโปรแกรมยังไง ครับ
จากที่ลองรันจากโค้ด
Code (C#)
private void button1_Click(object sender, EventArgs e)
{
Test_1();
}
รันได้แบบนี้ครับ
แต่ถ้า
Code (C#)
private void button1_Click(object sender, EventArgs e)
{
frmHtmlAgilityPack p = new frmHtmlAgilityPack();
Type t = p.GetType();
MethodInfo mi = t.GetMethod(textBox1.Text, BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(p, null);
}
จะมาแค่
ไม่รันต่อ ครับ
จากที่ ดีบักมันก็มาถึงบันทัดสุดท้ายนะครับ
แต่ richTextBox ไม่โชว์อะไร
Date :
2020-09-17 22:30:41
By :
lamaka.tor
จากที่ใช้
Code (C#)
MessageBox.Show(HttpUtility.HtmlDecode(strFormLabel));
ได้ผล แบบนี้ครับ
Date :
2020-09-17 22:44:57
By :
lamaka.tor
อยากได้ค่า ต้องคืนค่า เพราะมันมองไม่เห็น เพราะว่าตัวมันเองไม่มีค่า ไม่รับรู้เรื่องภายนอก
ถ้าเข้าใจ oop ก็บรรลุ ว่าแต่ มันก็มี test ให้ทดลองในตัวมันเองอยู่นะ คุณ tor เก่งอยู่แล้วคงเข้าใจ
Date :
2020-09-18 11:51:14
By :
บัญดิษฐ
ตอนนี้รัน method ได้หรือยังครับ
ถ้ายังมีทางเลือกดังนี้
1. เข้าเงื่อนไขตามที่ผมบอก
Code (C#)
if (textBox1.Text == "Test_1") {
Test_1();
} else if (textBox1.Text == "Test_N") {
Test_N();
} else {
MessageBox.Show("ไม่มีเมธอดนี้ในคลาส!");
}
// หรือ
switch(textBox1.Text)
{
case "Test_1":
Test_1();
break;
case "Test_N":
Test_N();
break;
default:
MessageBox.Show("ไม่มีเมธอดนี้ในคลาส!");
break;
}
2. ใช้เทคนิค Reflections (ที่คุณกำลังทำอยู่)
จาก No.2, 4 จะสังเกตว่าเมธอดที่จะรันไม่ได้ใส่ Access Modifier ดังนั้น C# จะใส่ค่า default ให้ซึ่งก็คือ private
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/accessibility-levels
(จากการทดสอบ)
เมื่อใช้เมธอด MethodBase.Invoke กับ Type.GetMethod ด้วย GetMethod(String, BindingFlags) overload
ที่มี flag เป็น NonPublic มันจะไม่คืนค่า private/protected แต่ทำงานถ้า flag เป็น internal เพราะฉะนั้น
แก้ method modifier ใน class เป็นแบบนี้
Code (C#)
class x
{
internal void Test_1()
{
// ...method code...
}
}
หรือใส่เป็น public โดยใช้ GetMethod(String) overload...โค้ด No.2 แก้เป็น
Code (C#)
private void button1_Click(object sender, EventArgs e)
{
frmHtmlAgilityPack p = new frmHtmlAgilityPack();
Type t = p.GetType();
MethodInfo mi = t.GetMethod(textBox1.Text);
mi.Invoke(p, null);
}
ใน class
Code (C#)
class x
{
public void Test_1()
{
// ...method code...
}
}
3. หา library เพื่อ evaluate C# script
https://stackoverflow.com/questions/53844/how-can-i-evaluate-a-c-sharp-expression-dynamically
(ดูคำตอบของ cdiggins)
สำหรับ Html Agility Pack...ไม่ต้องไปลองหมดทุกตัวอย่างก็ได้ครับ แค่ทำความเข้าใจตาม Documents และคอนเซปต์ของ XPath ก็พอ
https://html-agility-pack.net/documentation
https://www.w3schools.com/xml/xpath_intro.asp
Date :
2020-09-21 15:03:19
By :
PhrayaDev
จากโค้ดนี้
จะไม่สะดวก ครับ
เพราะว่าถ้าหากเราเพิ่ม method อีก เราก็ต้องมาเพิ่ม ข้อมูลในโค้ดนี้ เรื่อยๆ
ถ้าเรามี 1000 method เราก็ต้องเพิ่มมาอีก 1000 รอบ ใช่ไม๊ ครับ
แต่ความคิดผมคือ อยากจะรับ ชื่อ method แล้วมารัน method ได้เลย ครับ
ซึ่งจาก No. 4 ไม่แน่ใจว่าจะเรียกได้ไม๊ ว่า มันรัน method ได้แล้วครับ
เพียง แต่ ตัว richTextBox มันไม่ยอมรัน ครับ
ไม่รู้ว่า มันจะรันแค่ console อย่างเดียวไม๊
ไม่รัน control ด้วย
Date :
2020-09-21 20:43:54
By :
lamaka.tor
ศึกษาคห 1 อันนั้นตรงที่สุดแล้ว Evaluation
Date :
2020-09-22 07:52:28
By :
Chaidhanan
สรุป ตอนนี้ ในส่วนของการเอาชื่อ method ไปรัน นั้นเรียบร้อยดีไม่มีปัญหาครับ
ผมใช้โค้ดนี้ครับ
เพียงแค่ตอนนี้ ยังใช้งาน richTextBox1 ไม่ได้ตามรูป ครับ
จากรูป คือ มันรันมาถึง
Code (C#)
MessageBox.Show(HttpUtility.HtmlDecode(strFormLabel));
แต่มันไม่มีค่า
Code (C#)
richTextBox1.WriteLine(btest);
richTextBox1.WriteLine(HttpUtility.HtmlDecode(strFormLabel));
เหมือนมันเมินกันเอาดื้อแบบนั้นเลยครับ
ถ้า ดีบักที่ บรรทัดนั้น จะได้แบบนี้ ครับ
ประวัติการแก้ไข 2020-09-22 09:54:48
Date :
2020-09-22 09:47:28
By :
lamaka.tor
ลองอ่านดู ไม่น่าจะต้องเขียนเยอะ
https://www.codeproject.com/Articles/13779/The-expression-evaluator-revisited-Eval-function-i
Date :
2020-09-22 10:30:37
By :
Chaidhanan
ล่าสุดลองแบบนี้
richTextBox1 ก็ ไม่มีอะไรเหมือนเดิม
มาแค่
Code (C#)
MessageBox.Show(HttpUtility.HtmlDecode(strFormLabel));
ครับ
Date :
2020-09-22 11:15:28
By :
lamaka.tor
ส่งไฟล์โปรเจคมาครับ ผมจะแก้ให้ดู แค่ใส่ public
(เว้นแต่มีสิ่งที่เหนือความคาดหมาย)
ส่วนการ evaluation ตรงตามที่พี่ต่อต้องการแล้วครับ แต่ผมวางไว้สุดท้ายเพราะ
ตัวแปลง source code เป็น binary ไฟล์ของ .NET จะเป็น compiler ไม่ใช้ interpreter
ดังนั้น การ evaluate เหมือน php จึงเป็นไปไม่ได้ เนื่องจากมันกลายเป็น CLI->Assembly แล้ว
การ evaluate ตามลิงค์ SO ที่ให้ไป จึงต้องพึง compiler และจะมีการ build ทุกครั้งที่เรียก method
แต่ข้อดีของมันคือสามารถเรียกแบบนี้ได้
Code (C#)
x y = new x();
eval("y." + "MethodName" + "();"); // สามารถเรียกเมธอดด้วย string ได้
ในขณะที่ run-time(source code ถูก compiled แล้ว) ไม่สามารถเรียกชื่อ method โดยตรงได้
ต้องทำ reflection เพื่อเจาะ binary file(exe) ดึงข้อมูลแบบ Assembly ผ่าน .Net CLI(เหมือนโหลด .dll แค่ invoke ตัวมันเอง)
ประวัติการแก้ไข 2020-09-22 12:10:42
Date :
2020-09-22 12:09:01
By :
PhrayaDev
แต่ผมยังสงสัยอยู่อย่างว่า ถ้าต้องการศึกษาให้เข้าใจ จะคัดลอกโค้ดมาตุนไว้ทำไม
วิชาการพวกนี้ไม่เน้นจำจะไปเร็วกว่า ไม่ใช่ Anatomy ของการแพทย์ที่ต้องท่องจำ
ประกอบกับการทำความเข้าใจ เพราะมันเกี่ยวข้องกับชีวิตมนุษย์
แต่ถ้าตุนไว้เพราะอยากสะสม ก็ว่าไปอย่าง เพราะผมก็ชอบโหลดหนังพวกซีรีส์หรือละครมาสะสมไว้
...แต่อย่าลืมว่า เทคโนโลยี มันเปลี่ยนแปลงทุกๆ x ช่วงเวลา
การเขียนโปรแกรม ตราบใดที่เรายังต้องพึ่งเครื่องมือในการพัฒนาของคนอื่น
เราต้องปรับตัวให้เข้ากับสภาพแวดล้อม และทรัพยากรสังเคราะห์เหล่านี้
แต่ถ้าอยากให้สิ่งเหล่านี้ปรับเข้าหาเรา...ต้องคิดค้นขึ้นมาเอง อย่าไปใช้เลย .NET
เพราะไม่มีวันที่มันจะทำได้ดั่งใจเราไปทุกอย่าง
อย่าคิดมากครับ ถือว่าเป็นคำแนะนำและความหวังดี
อะไรที่เราทำแล้วมีความสุขก็ทำๆ ไปเถอะครับ...ได้ไม่ได้ก็ว่ากันไปตามเรื่อง
Date :
2020-09-22 12:26:22
By :
PhrayaDev
ถ้าผมเจอ ความรู้ใหม่ๆ ผมก็มักจะเก็บโค้ดไว้ ครับ เผื่อ จะได้เอาไปดัดแปลงรอบหน้า เราก็จะได้รู้ ที่มา ที่ไป
แต่ก่อน เคย มีปัญหาว่า เวลาจะศึกษาอะไรที ต้องมาค้นหาใหม่เรื่อยๆ
ผมจึงแยก โปรเจค บางส่วนมาไว้ เก็บโค้ด ต่างๆ ไว้นั่งศึกษาคราวหลัง ครับ
ซึ่ง ย้ำอีกครั้งนะครับ ว่าตอนนี้ โค้ดในการรันไม่มีปัญหา มันสามารถ อ่าน เมทธอด ที่ส่งไปให้ได้ ปกติแล้ว ครับ
เพียงแค่ติดอยู่ว่า เวลาเรียกผ่าน run-time ตัว richTextBox1 ก็ ไม่มีอะไร มันไม่ตอบรับ ครับ
ส่วน link โปรเจค เป็นตัวนี้ ครับ(อาจจะใหญ่หน่อยนะครับ)
https://mega.nz/folder/4JIxnIyY#8Ge_AV3C5Rq_u4tBKZRSaw
ประวัติการแก้ไข 2020-09-22 13:58:20
Date :
2020-09-22 13:56:23
By :
lamaka.tor
เอามาหมดเลย...อยู่ในโฟลเดอร์ไหนครับ โปรเจคเรียก method
หรือจะให้ทำในตัวใหญ่เลย เยอะไปไหม
Date :
2020-09-22 14:14:58
By :
PhrayaDev
กำลังดาวน์ครับ MEGA ไม่ได้ใช้นานหลายปี โหลดช้ามากกกก
Date :
2020-09-22 14:34:10
By :
PhrayaDev
เปิด project ยังไม่ได้ครับ กำลังหาวิธีอยู่
Date :
2020-09-22 15:30:32
By :
PhrayaDev
ผมยอมแพ้ครับ ของแถมเยอะ(จริงๆ มันคือ NuGet package+dependencies ที่ไม่ support ระหว่าง version)
Quote: This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\..\packages\Microsoft.CodeAnalysis.Analyzers.3.0.0\build\Microsoft.CodeAnalysis.Analyzers.props.
เราอาจใช้ไม่เหมือนกัน (ของผม VS2017)
ผมยังไม่มีเวลาพอ(...เป็นข้ออ้างเพราะขี้เกียจไล่แก้และต่อไปอาจลืม )
เลยสร้างโปรเจคใหม่แล้วคัดลอก Component กับซอสโค้ด และใส่ event
และนี่คือซอสโค้ดแบบ clean
frmHtmlAgilityPack.Designer.cs (C#)
namespace dotnetfiddle
{
partial class frmHtmlAgilityPack
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.panel1 = new System.Windows.Forms.Panel();
this.button1 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// richTextBox1
//
this.richTextBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.richTextBox1.Location = new System.Drawing.Point(0, 62);
this.richTextBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(687, 242);
this.richTextBox1.TabIndex = 0;
this.richTextBox1.Text = "";
//
// panel1
//
this.panel1.Controls.Add(this.button1);
this.panel1.Controls.Add(this.textBox1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(687, 62);
this.panel1.TabIndex = 1;
//
// button1
//
this.button1.Location = new System.Drawing.Point(451, 16);
this.button1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(100, 28);
this.button1.TabIndex = 1;
this.button1.Text = "Run";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(17, 16);
this.textBox1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(407, 22);
this.textBox1.TabIndex = 0;
//
// frmHtmlAgilityPack
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(687, 304);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.panel1);
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "frmHtmlAgilityPack";
this.Text = "frmHtmlAgilityPack";
this.Load += new System.EventHandler(this.frmHtmlAgilityPack_Load);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
public System.Windows.Forms.RichTextBox richTextBox1;
public System.Windows.Forms.Button button1;
public System.Windows.Forms.TextBox textBox1;
}
}
และปัญหาที่ตามมาอีกคือตาม Add references แต่โชคดีมีแค่สองสามอัน
ต่อมาก็เจอเรื่องแปลกประหลาด(เนื่องจากผมไม่ได้ใช้ richTextBox นานมาก...เอ๊ะหรือไม่เคยเลย )
มาตกม้าอยู่นานเพราะ richTextBox ที่ผมใช้อยู่ไม่มี WriteLine method
เลยว๊าปเข้าไปดู Docs รู้ว่าไม่มีจริง...ผมเลยใช้เมธอด built-in แทน (AppendText)
นั่งงมไปตามความเชื่อของตัวเอง
...
และแล้วข่าวดีก็มาถึง ...รู้ต้นตอแล้วครับ
ไม่เกี่ยวกับ Access Modifier อย่างที่ผมเข้าใจตั้งแต่ทีแรก(ที่ตอบไปเพราะอ้างอิงตาม DotNetFilddle)
สรุปคือไม่ว่าจะเป็น Public/NonPublic โดยเฉพาะ private ที่สงสัย เรียกได้หมด
แต่กุญแจสำคัญคือ Parameter ที่ส่งไป invoke
โดยธรรมชาติ Control จะไม่ถูกส่งไปด้วย...แปลว่าตอน invoke มันไม่มี richTextBox
ที่เราเห็นข้อความ True บรรทัดแรกเกิดจากที่ AppendText เข้าไปก่อนที่จะทำการ invoke
ดังนั้น วิธีแก้คือเราต้องแนบ richTextBox เป็น parameter เข้าไปด้วย(แนบได้หลาย control เพราะเป็น array)
frmHtmlAgilityPack.cs (C#)
using HtmlAgilityPack;
using System;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web;
using System.Windows.Forms;
namespace dotnetfiddle
{
public partial class frmHtmlAgilityPack : Form
{
public frmHtmlAgilityPack()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
frmHtmlAgilityPack p = new frmHtmlAgilityPack();
richTextBox1.AppendText((GetType() == typeof(frmHtmlAgilityPack)).ToString());
Type t = GetType();
MethodInfo mi = t.GetMethod(textBox1.Text, BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(p, new object[] {richTextBox1});
}
void Test_1(RichTextBox rtxt1)
{
var html = "<html dir=\"ltr\">\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta content=\"text/html; charset=utf-8\">\r\n<base href=\"http://it.hcportal.ihess.com/itpmo\"><style>\r\n<!--\r\n.headertop1\r\n\t{width:100%}\r\n.headercontent\r\n\t{color:#000000;\r\n\tfont-family:verdana;\r\n\tfont-size:16pt}\r\n.headercontent em\r\n\t{font-weight:bold}\r\n.breadcrumb td\r\n\t{padding-left:2px;\r\n\tpadding-right:2px}\r\n.breadcrumb a\r\n\t{font-family:tahoma;\r\n\tfont-size:8pt}\r\n.content\r\n\t{margin-top:6px;\r\n\twidth:100%;\r\n\tborder-bottom:solid 1px #9ca3ad}\r\n.toolbar\r\n\t{border:1px solid #e8eaec;\r\n\tbackground-color:#f8f8f9;\r\n\tpadding-top:3px;\r\n\tpadding-bottom:6px;\r\n\tpadding-right:3px;\r\n\tpadding-left:3px}\r\n.toolbarbutton a, .toolbarsep\r\n\t{font-family:verdana;\r\n\tfont-size:.68em;\r\n\tpadding-left:3px;\r\n\tpadding-right:3px}\r\n.toolbarbutton a\r\n\t{text-decoration:none}\r\n.toolbarsep\r\n\t{color:#c7cbd1}\r\n.spacer\r\n\t{height:10px;\r\n\tfont-size:1px;\r\n\tline-height:1px}\r\n.formline, .noheight\r\n\t{height:1px;\r\n\tfont-size:1px;\r\n\tline-height:1px}\r\n.formlabel, .formbody, .digestlabel, .altdigestlabel, .deletedlabel, .altdeletedlabel\r\n\t{font-family:tahoma;\r\n\tfont-size:8pt;\r\n\tpadding:0px 7px 0px 7px;\r\n\tvertical-align:top}\r\n.formlabel, .digestlabel, .altdigestlabel, .deletedlabel, .altdeletedlabel\r\n\t{color:#616a76;\r\n\tfont-weight:bold}\r\n.rulerow\r\n\t{border-bottom:solid 1px #9ca3ad;\r\n\theight:0px;\r\n\tfont-size:1px;\r\n\tline-height:0px}\r\n.formbody\r\n\t{color:#000000}\r\n.edited\r\n\t{text-decoration:line-through;\r\n\tcolor:#9ca3ad}\r\n.descriptiontext\r\n\t{color:#9ca3ad;\r\n\tfont-family:tahoma;\r\n\tfont-size:8pt;\r\n\tpadding-top:5px;\r\n\tpadding-bottom:7px}\r\n.formline\r\n\t{border-bottom:1px solid #D7DEAC}\r\n.editedicon, .newicon, .deletedicon\r\n\t{color:#000000;\r\n\tfont-family:Small Fonts,Tahoma,Verdana,Sans Serif;\r\n\tfont-size:7pt;\r\n\tpadding-top:0px;\r\n\tpadding-right:3px;\r\n\tpadding-bottom:1px;\r\n\ttop:2px;\r\n\tmargin-right:8px;\r\n\tmargin-left:8px;\r\n\tfont-weight:normal}\r\n.editedicon\r\n\t{background-color:#ffffcc}\r\n.newicon\r\n\t{background-color:#b1faa2}\r\n.deletedIcon\r\n\t{background-color:#ffcccc}\r\n.messagespace\r\n\t{color:#5D6437;\r\n\tfont-family:tahoma;\r\n\tfont-size:8pt;\r\n\tpadding-top:5px;\r\n\tpadding-bottom:7px}\r\n.editedexample\r\n\t{background:#FFFFBF;\r\n\tpadding:1px}\r\n.vh, .vb, .altvb, .deleted, .altdeleted\r\n\t{font-weight:normal;\r\n\ttext-align:left;\r\n\ttext-decoration:none;\r\n\tvertical-align:top;\r\n\tfont-size:8pt;\r\n\tfont-family:tahoma,sans-serif;\r\n\tpadding-left:5px;\r\n\tpadding-right:8px}\r\n.vb, .altvb, .deleted, .altdeleted, .digestlabel, .altdigestlabel, .formlabel, .formbody\r\n\t{border-bottom:solid 1px #e8eaec;\r\n\tpadding-top:2px;\r\n\tpadding-bottom:5px}\r\n.vb div.nobr, .altvb div.nobr\r\n\t{white-space:nowrap}\r\n.vh\r\n\t{color:#76808e;\r\n\tfont-weight:bold;\r\n\tpadding-top:7px;\r\n\tpadding-bottom:6px;\r\n\twhite-space:nowrap}\r\n.vb, .altvb\r\n\t{color:#616a76}\r\n.altvb, .altdigestlabel, .altdeleted, .altdeletedlabel, .formlabel, .formbody\r\n\t{background:#f8f8f9}\r\n.digesttext\r\n\t{color:#000000}\r\n.deleted, .deletedlabel, .altdeleted, .altdeletedlabel\r\n\t{text-decoration:line-through;\r\n\tcolor:#9ca3ad}\r\n.deleted a, .altdeleted a\r\n\t{color:#9ca3ad;\r\n\ttext-decoration:line-through}\r\n-->\r\n</style>\r\n</head>\r\n<body>\r\n<table class=\"headertop1\" cellspacing=\"0\" cellpadding=\"0\">\r\n<tbody>\r\n<tr>\r\n<td class=\"headercontent\">\r\n<table class=\"breadcrumb\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\r\n<tbody>\r\n<tr>\r\n<td><a href=\"http://it.hcportal.ihess.com/itpmo\">IT PMO</a></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<em>Global JV Accounting & JV Audit Team...</em> has been added </td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n<table class=\"content\" cellspacing=\"0\" cellpadding=\"0\">\r\n<tbody>\r\n<tr>\r\n<td colspan=\"3\">\r\n<table class=\"toolbar\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\r\n<tbody>\r\n<tr>\r\n<td>\r\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\r\n<tbody>\r\n<tr>\r\n<td class=\"toolbarbutton\"><a href=\"http://it.hcportal.ihess.com/itpmo/_layouts/15/MySubs.aspx\">Modify my alert settings</a></td>\r\n<td class=\"toolbarsep\">|</td>\r\n<td class=\"toolbarbutton\"><a href=\"http://it.hcportal.ihess.com/itpmo/Lists/IT Project Portfolio/DispForm.aspx?ID=1546\">View Global JV Accounting & JV Audit Team...</a></td>\r\n<td class=\"toolbarsep\">|</td>\r\n<td class=\"toolbarbutton\"><a href=\"http://it.hcportal.ihess.com/itpmo/Lists/IT Project Portfolio\">View Work Capture List</a></td>\r\n<td class=\"toolbarsep\">|</td>\r\n<td class=\"toolbarbutton\"><a href=\"http://it.hcportal.ihess.com/itpmo/_layouts/15/mobile/dispform.aspx?List=09DE8736-E6AF-4AB4-B452-3996693F305B&ID=1546\">Mobile View</a></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n</td>\r\n</tr>\r\n<tr>\r\n<td colspan=\"3\" class=\"spacer\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Project Name:</td>\r\n<td class=\"formbody\">Global JV Accounting & JV Audit Team Spotfire reporting needs </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Description:</td>\r\n<td class=\"formbody\">\r\n<div class=\"ExternalClassBBDFEAB759A84CB79ABCDAFE409E645F\">\r\n<p>Need of a summary dashboard to serve as a health check report</p>\r\n</div>\r\n </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Justification:</td>\r\n<td class=\"formbody\">\r\n<div class=\"ExternalClassECA99D876FB54C11935B728DF3114AA9\">\r\n<p>enhanced user experience</p>\r\n</div>\r\n </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Priority Group:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Start Date:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">End Date:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ITLT Owner:</td>\r\n<td class=\"formbody\">Murray, Jason </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">IT Teams Involved:</td>\r\n<td class=\"formbody\">Spotfire COE </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Rough Order of Magnitude:</td>\r\n<td class=\"formbody\">Medium (161 - 500 person hours) </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Perceived Value:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Assets Impacted:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Functions Impacted:</td>\r\n<td class=\"formbody\">Other Corporate Function </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">State:</td>\r\n<td class=\"formbody\">Backlog </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Sponsored By:</td>\r\n<td class=\"formbody\">IT </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Project Sponsor:</td>\r\n<td class=\"formbody\">Larcombe, Nick </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Primary Driver:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Estimated Cost:</td>\r\n<td class=\"formbody\">< $50,000 </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Requested Date:</td>\r\n<td class=\"formbody\">3/31/2019 </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Project Submitted By:</td>\r\n<td class=\"formbody\">Pamarty, Krishna </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Technical Authority:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Supervisor:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Prioritization Forum:</td>\r\n<td class=\"formbody\">IT </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Date Constraint:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Problem Clearly Defined:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Alignment to Goal:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Stakeholders Engaged:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Readiness Score:</td>\r\n<td class=\"formbody\">0% </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Hess Standard Architecture Compatibility:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Process Impact:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Technical Complexity:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Support Capability:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Delivery Score:</td>\r\n<td class=\"formbody\">0% </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Relative Value:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Cost of Delay:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Probability of Success:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Value Score:</td>\r\n<td class=\"formbody\">0% </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Prioritization Score:</td>\r\n<td class=\"formbody\">0% </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Take Work Out Initiative:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Comments:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Priority:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">2019 IT Budget:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Enterprise-Wide Initiative:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Weekly Status Report:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Deliverables and Outcomes:</td>\r\n<td class=\"formbody\">\r\n<p><span aria-hidden=\"true\" id=\"ms-rterangepaste-start\"></span>SAP BI / Spotfire dashboard<span aria-hidden=\"true\" id=\"ms-rterangepaste-end\"></span></p>\r\n </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Project Duration:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Risks and Uncertanties:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Impacts:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Cost Center:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Technical Reviewer:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">IT AFE Amount:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Internal Costs:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">External Costs:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Baseline Impact:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Project Manager:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Current Status Summary:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Percent Complete:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ITLT Approval Date:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Manager Approval Date:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">IT Budget:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">IT AFE Number:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Main Department:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ITLT Review Recommended:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ExpandSection1:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ExpandSection2:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ExpandSection3:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">ExpandSection4:</td>\r\n<td class=\"formbody\">No </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Manager:</td>\r\n<td class=\"formbody\"> </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td class=\"formlabel\">Solution:</td>\r\n<td class=\"formbody\">\r\n<div class=\"ExternalClass43F67F58AF0A4A9E82DDBA6AAE24B901\">\r\n<p></p>\r\n</div>\r\n </td>\r\n<td class=\"altvb\"> </td>\r\n</tr>\r\n<tr>\r\n<td colspan=\"3\" class=\"descriptiontext\">Last Modified 1/29/2019 2:49 PM by Chidhambaram, Vanniarajan</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n</body>\r\n</html>";
html = Regex.Replace(html, @"^\s*$\n", string.Empty, RegexOptions.Multiline);
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(html);
//var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body //table[@class='"+"content"+"']] //div[@class='"+"file_detail"+"'] //table[@class='"+"highlighttable"+"']");
HtmlNode test = htmlDoc.DocumentNode.SelectSingleNode("//body //table[@class='" + "content" + "']");
//HtmlNodeCollection rows = htmlDoc.DocumentNode.SelectNodes("//body //table[@class='"+"content"+"'] //tr");
string strFormLabel;
//strFormLabel = test.SelectSingleNode("//tr[td[@class='"+"formlabel"+"']='Project Name:']/td[2]").InnerText;
strFormLabel = htmlDoc.DocumentNode.SelectSingleNode("//body //table[@class='" + "headertop1" + "'] //tr[1] /td[1]").InnerText;
bool btest = strFormLabel.Contains("has been added");
//richTextBox1 จะใช้งานไม่ได้
/*
richTextBox1.WriteLine(btest);
richTextBox1.WriteLine(HttpUtility.HtmlDecode(strFormLabel));
richTextBox1.AppendText(HttpUtility.HtmlDecode(strFormLabel));
*/
//...ใช้ rtxt1 ซึ่งเป็น control argument ที่เราเข้ามาแทน
rtxt1.AppendText(HttpUtility.HtmlDecode(strFormLabel));
//MessageBox.Show(HttpUtility.HtmlDecode(strFormLabel));
}
private void frmHtmlAgilityPack_Load(object sender, EventArgs e)
{
}
}
}
Date :
2020-09-22 18:43:44
By :
PhrayaDev
HtmlAgilityPack vs JSON --> ท่านผู้ว่า vs นายอำเภอ ใครจะวิ่งเร็วกว่ากัน
เก็บสถิติ ทำ benchmark ด้วยก็ดีครับ
อยากรู้ว่าจะมีวิธีเปรียบเทียบกันอย่างไร
เพราะปกติสองอย่างนี้มักใช้งานร่วมกันมากกว่าแข่งกัน
ยังไงก็จะรอผลพิสูจน์ครับ
Date :
2020-09-23 17:22:26
By :
PhrayaDev
Load balance : Server 00