WinApp C# อธิบายปัญหาไม่ถูกครับ นึก คำศัพท์ทางโปรแกรมเมอร์ก็ไม่ถูกด้วย(5555)
น่าจะให้อาจารย์หน้าฮี จัดสักหน่อยนะ
"คือถ้าจะเขียนโปรแกรมให้ดี ก็ต้องเข้าใจพิ้นฐานมันก่อน อย่าเรียนลัด
เข้าใจว่าเก่ง แต่ต้องเข้าใจหลักการก่อน โค้ดข้างบนง่ายนิดเดียว
แค่เข้าใจว่าอะไรทำก่อน ทำหลัง เท่านั้นครับ"
ถ้าอยากให้เข้าใจมากขึ้น ควรอ่านอันนี้ เขาเขียนได้ดีอยู่นะครับ
หรือจะไปอ่านแบบ eng ก็ไม่ว่ากันครับ ค้นหาคำว่า OOP เด้อ
https://www.tamemo.com/post/122/all-about-oop-1-class-and-object/
Date :
2019-06-25 08:21:11
By :
บัญดิษฐ
Code (C#)
public static string หำ = "";
public static void testExButton(this Button btn, string หำ)
{
btn.Click += new EventHandler((object sender, EventArgs e) =>
{
string X = string.IsNullOrEmpty(หำ) ? Form1.หำ : หำ;
_= MessageBox.Show(X);
});
}
Date :
2019-06-25 12:03:21
By :
xxx
ตัวนี้คือโค้ดจริงครับ
Code (C#)
public static void SetGridDefaultCellStyle(this System.Windows.Forms.DataGridView dgv,bool ShowID = true, bool SetManEdit = true, int ColumnID = 1,string AutoID = "")
{
dgv.SetDefaultCellStyle();
if (!ShowID)
{
dgv.Columns[0].ReadOnly = true;
dgv.AllowUserToAddRows = false;
dgv.AllowUserToDeleteRows = false;
dgv.ReadOnly = true;
}
if (SetManEdit)
{
dgv.Columns[dgv.Columns.Count - 1].ReadOnly = true;
dgv.Columns[dgv.Columns.Count - 1].Width = 250;
dgv.Columns[dgv.Columns.Count - 2].ReadOnly = true;
dgv.Columns[dgv.Columns.Count - 2].Width = 250;
dgv.Columns[dgv.Columns.Count - 3].Width = 250;
// if(id != null) dgv.Columns[ColumnID].Visible = false;
dgv.CellValueChanged += new DataGridViewCellEventHandler((object sender, DataGridViewCellEventArgs e) =>
{
DataGridView _dgv = sender as DataGridView;
if (e.RowIndex < 0) return;
if (!string.IsNullOrEmpty(UserLogin.EmployeeName))
dgv[_dgv.ColumnCount - 2, e.RowIndex].Value = UserLogin.EmployeeName;
dgv[_dgv.ColumnCount - 1, e.RowIndex].Value = DateTime.Now;
/* if (id != null || e.RowIndex > 0)
{
if (string.IsNullOrEmpty(dgv[ColumnID, e.RowIndex].Value.ToString()))
dgv[ColumnID, e.RowIndex].Value = id;
}
*/
if (string.IsNullOrEmpty(AutoID) && string.IsNullOrEmpty(dgv[0, e.RowIndex].Value.ToString()))
{
string format = new Regex(@"(\d{1,})", RegexOptions.None).Replace(AutoID, "");
if (e.RowIndex == 0)
{
dgv[0, e.RowIndex].Value = (1d).ToString(AutoID);
}
else
{
int _id = new Regex(@"(\d{1,})", RegexOptions.None).Matches(dgv[0, e.RowIndex - 1].Value.ToString())[0].Groups[1].Value.ToInt();
dgv[0, e.RowIndex].Value = (_id).ToString(AutoID);
}
}
});
dgv.KeyDown += new KeyEventHandler((object sender, System.Windows.Forms.KeyEventArgs e) =>
{
if (e.KeyCode == System.Windows.Forms.Keys.Delete &&
System.Windows.Forms.MessageBox.Show("คุณต้องการลบข้อมูลหรือไม่", "Warning", System.Windows.Forms.MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No
&& UserLogin.CheckUserConferm() == false)
{
DataGridView g = sender as DataGridView;
g.AllowUserToDeleteRows = false;
}
});
}
}
จาก
Code (C#)
if (id != null || e.RowIndex > 0)
{
if (string.IsNullOrEmpty(dgv[ColumnID, e.RowIndex].Value.ToString()))
dgv[ColumnID, e.RowIndex].Value = id;
}
ในโค้ด ด้านบน คือผมอยากให้ DataGridView มันเพิ่ม ค่า ID ต่างๆ เมื่อมีการเปลีย่นแปลง และ ค่า ID หลัก เป็นค่าว่าง ครับ
เช่น
คือให้มัน Add ค่า COMPANY_ID ใน DataGridView ครับ
ซึ่งในโปรแกรมมี DataGridView กับ ID ต่างๆเยอะมาก
ผมจึงเขียนเป็น Exten ออกมาเพื่อให้ใช้ได้กับทุก DataGridView
ติดอยู่จุดเดียว คือ มันรับค่าตั้งแต่แรกไปใช้ ไม่ใช่ค่าที่แก้แล้วครับ
Date :
2019-06-25 20:02:39
By :
lamaka.tor
พอดีงานเร่ง เลยต้องเขียนเหมือนเดิมไปก่อนครับ
แต่ก็ยังอยากได้วิธีแก้อยู่นะครับ
สำหรับท่านใดที่อยากลดโค้ด
เราสามารถใช้ delegate สำหรับๆ หลายๆ Control ได้นะครับ
อย่างเช่น โค้ดที่มันคล้ายๆกัน แบบนี้
เราก็ยุบให้เป็น แบบนี้
ถ้าอยากให้มันใช้ได้กับทุกฟอร์มก็เขียนไว้ใน Exten ประมาณนี้ครับ
vb.net
ประวัติการแก้ไข 2019-06-25 20:35:14
Date :
2019-06-25 20:26:12
By :
lamaka.tor
จาก #No 6 การลดโค๊ด จริงฯแล้วก็ไม่ได้เขียนแบบนี้
Date :
2019-06-26 11:58:28
By :
xxx
@บัญดิษฐ
--- xxx คือหลานเหลนโหลนของหน้าฮี ถ้านับอายุ
1 อายุหายใจ
2 อายุปี
3 อายุร้อยปี
4 อายุพันปี
5 อายุหมื่อนปี
...
...
ปี้ปี้ปี้.... จะหน่วยนับอะไรก็ช่างแม่งมันเหอะ
xxx คิดได้ระดับนี้แสดงว่าไม่ธรรมดา (เขาเคยเล่าควยในใจให้ผมฟัง )
--- พี่พี่พี่ (ผมแอบยิ้มอยู่ในใจ เอ็งอายุหายใจแค่ 2 วินาที และตัวตรูกำลังจะตายด้วยวัยกำลังจะเข้าไกล้พันปีอายุ)
เขาเคยเล่าควยในใจให้ผมฟัง (xxx เขาเล่ามาให้ผมฟังอย่างนั้น ผมก็ต้องฟังเหตุผลเดียวก็คือ น้องสาว 2 คน ของมันหน้าตาดี คนหนึ่งขาว และอีกคนหนึ่งดำ)
...
...
...
SAP & Microsoft CRM/etc...
... เมื่อก่อนผมตอบโจทย์ไม่ได้ แต่วันนี้ไม่เหมือนเดิม
ผมใช้ศัพท์คำนี้ว่า CMS บนความต้องการของโปรแกรมเมอร์ ชาวไทย/ชาวทวย ทุกฯฯฯคน (รวมถึงสุนัขทุกตัวด้วย)
--- MVC อยากจะแก้ไข ก็แก้ไป
------ Model/View/Controller/etc...
--- อยากจะเพิ่ม อยากจะลบ ก็ทำไป
--- อยากเพิ่ม Table ในฐานข้อมูลจริง
--- อยากเพิ่ม หน้าจอ แสดงผลเอง
...
...
...
--- อยากไช้ Angular/React/Reแดก/ ห่าเหวอะไรก็ว่ากันไป
--- อยาก... ก็ทำไป ทำไปเลย
--- อยากใช้ Theme โน้นโน่นนี่ (Bootstrap 3/ BootStrap 4) อะไรก็ได้ก็ว่ากันไป
จากรูปภาพด้านล่าง ไม่ต้องลองจินตนาการว่า
ผมตอบโจทย์ได้แล้ว
Date :
2019-06-26 12:27:27
By :
หน้าฮี
Date :
2019-06-26 12:29:42
By :
หน้าฮี
Code (XML)
<link rel="stylesheet" href="~/assets2/css/ASS.css">
<script>
window.RootURL = '@Url.Content("~/")';
console.log(window.RootURL);
</script>
</head>
<body>
@{
var txtTopLeftMenus = System.IO.File.ReadAllText("./wwwroot/menus/TopLeftMenu.txt");
var txtTopRightMenus = System.IO.File.ReadAllText("./wwwroot/menus/TopRightMenu.txt");
//พวกอยากจะเพิ่มอยากจะลบอะไร ก็ทำไปตามสะดวก
}
<div class="ass-header">
<div class="container">
ปล. สิ่งเหล่านี้ผมเตรียมเอาไว้ให้ แต่คนทำไม่ใช่ผม แต่เป็นพวกคุณเอง (อยากจะแก้ อยากจะเพิ่ม อยากจะลบ อยาก...)
หลักการคือ Inject
Date :
2019-06-26 12:37:26
By :
หน้าฮี
@TOR_CHEMISTRY ถ้าคุณต้องการคำตอบ ค้นหาคำว่า Injet
ความต้องการของคุณมันไม่ง่ายแต่ก็ไม่ยาก
ความต้องการของผม ถ้าโปรแกรมเมอร์เขียนโค๊ดเข้ามายังโปรแกรมของผม อทิเช่น
Code (VB.NET)
Public Class หอยหาย
Public Property Id As Integer
Public Property Name As String
Public Property Ass As String = "หายตอนไหนว่ะ"
'...
End Class
ฉีด BootStrap
ฉีด css
ฉีด Html
ฉีด อยากแีดอะไรก็ฉีด ฉี่ด้วยก็ได้
เขียนหาเหวอีกตั้งมากมาย จะเขียนด้วยภาษาอะไรก็ตาม
--- มันก็ถูกฉีดเข้ามาได้ (Inject) และพร้อมใช้งาน
Date :
2019-06-26 12:52:45
By :
หน้าฮี
สิ่งที่ผมทำไปแล้วมีดังนี้
-- Model ชื่อว่า หอยModel.DLL (RDBMS ALLS)
-- View ชื่อว่า หอยView.DLL
-- Controller ชื่อว่า หอยController.DLL
-- JSFramework ชื่อว่า หอยJSFramwork.DLL
-- Boostrap Framework ชื่อว่า หอยBootstrap.DLL
------ เห็นอะไรสวยฯ อยากใช้ก็ใช้อันนั้นแหละ โปรแกรมของผมไม่ได้ห้ามเอาไว้ อยากทำอะไรก็ทำ
-- Html ชื่อว่า หอยHTML.DLL
-- css ชื่อว่า หอยCSS.DLL
เหลือแต่ว่าโปรแกรมเมอร์จะเขียน หอย???.DLL อะไรเพิ่มเติมเข้ามาอีก
(เพิ่ม/แก้ไข/ลบ ได้ด้วยโปรแกรมเมอร์เอง)
Date :
2019-06-26 13:00:34
By :
หน้าฮี
.NET Core ผมเอาอยู่ แต่ผมอยากจะใช้ ฺBlazor (มันพึ่งมา)
ไม่รู้ว่ามันจะมีโอกาสได้ใช้งานมันหรือเปล่า
...
...
...
ปล. ที่ผมบอกว่าผมไม่ได้สนใจ Angular/React/Vue/etc.. ก็เพราะเจ้านี่แหละ Blazor
Date :
2019-06-26 13:16:34
By :
หน้าฮี
.NET Core >= 2.2 มันก็คงจะไม่หนีไปจากนี้ไปมากนัก ถ้าผมเดาไม่ผิด เช่น
Code (C#)
public async Task<string> RenderToStringAsync(string viewName, object model)
{
var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
using (var sw = new StringWriter())
{
var viewResult = _razorViewEngine.FindView(actionContext, viewName, false);
if (viewResult.View == null)
{
throw new ArgumentNullException($"{viewName} does not match any available view");
}
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);
await viewResult.View.RenderAsync(viewContext);
return sw.ToString();
}
}
Date :
2019-06-26 13:18:31
By :
หน้าฮี
Load balance : Server 00