 |
|
WinApp C# จากโค้ดประมาณนี้ ผมอยากวิธีให้มันเขียนให้น้อยๆลง กว่านี้ ได้ไม๊ครับ |
|
 |
|
|
 |
 |
|
เวลาผมเขียน winapp ผมไม่เขียนให้มันผูกกัน ให้ยุ่งยากครับ
แต่ ผมจะใช้ list เก็บ form pointer แยกเป็น form ไปเลยครับ
เวลา create new form ก็แค่ส่ง พารามิเตอร์ เข้าไปในแต่ละ form
ทำงานอิสระ แยกกันไปเลย
|
ประวัติการแก้ไข 2019-06-27 08:27:07
 |
 |
 |
 |
Date :
2019-06-27 08:24:06 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
@TOR
ปัญหาของคุณผมเคยตอบไปเมื่อหลายปีที่ผ่านมา ณ. www.greatefrirnds.biz (ไม่แน่ใจว่า ผมเขียนถูกไหม?)
ตอนนั้นถ้าผมใส่สูทรผูกไทร์ เป็นผู้ดี ความคิดเห็นของผมก็ยังอยู่
แต่ถ้าผมใส่กางเกงในตัวเดียว/บางครั้งก็ไม่ใส่ และออกมาเดินเพ่นพ่านนอกบ้าน (เขาลบทิ้งทันที)
--- ตอนนั้นคนที่ถามเขาใช้ Visual FoxPro มา Call .NET Framework 4.x)
ผมจำไม่ได้ว่ากระทู้ไหน? และจำไม่ได้ว่าตอนนั้นผมชื่ออะไร? +55555
|
 |
 |
 |
 |
Date :
2019-06-27 10:20:50 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (VB.NET)
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim db As New dbBigDataContext
Dim kUnit = db.Units
Dim frmUnitCode As New BasicCode2(kUnit)
frmUnitCode.Show()
End Sub
End Class
Public Class BasicCode2
Private kTargetTable As Data.Linq.Table(Of Units)
Sub New(ByVal kTableName As Data.Linq.Table(Of Units))
kTargetTable = kTableName
Call LoadData()
End Sub
Private Sub LoadData()
'/// ตรงนี้ยังติดปัญหาเรื่อง การเปลียนค่าชื่อตารางทีต้องการ ในที่นี้คือ Units เป็นอืน ๆ เช่น Categories , Colors ว่าจะทำอย่างไร ///
Dim kBasicCodes = From k In kTargetTable Select k.UnitCode, k.Description
Order By UnitCode
'code C R U D
dgvBasicCode.DataSource = kBasicCodes.ToList()
End Sub
End Class
|
 |
 |
 |
 |
Date :
2019-06-27 10:39:25 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดูคห 3 ครับ
|
 |
 |
 |
 |
Date :
2019-06-27 13:19:13 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองส่งเป็นค่าที่จำเป็นไปที่ form นั้นไหมครับ
จากหน้าจอที่ให้มาก็ส่ง
ข้อมูลของ row ที่จะแก้ไป (อาจส่งไปเป็น datatable / dataset / datarow / array ไปก็ได้)
แล้วส่ง ชือ table ไป
ปุ่ม save ก็แค่เขียนคำสั่ง update ชื่อtable where ตาม id
สั่ง execute ก็น่าจะได้แล้วครับ
|
 |
 |
 |
 |
Date :
2019-06-27 14:01:05 |
By :
fonfire |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
"ยังยืนยัน นอนยันให้ไปอ่านเรื่อง OOP จากนั้น ก้ไป Dapper หรือ ไม่ก็ EF ลากวางเลิกได้แล้ว"
หรือไม่ก็ตัวอย่างบางตอนนะ สร้างโปรเจ็คชื่อ Vol.SampleForm
แล้วสร้างฟอร์มชื่อ frmBase หน้าตาตามนี้ หรือไม่ก็ได้เด้อ

โค้ดข้างใน
Code (C#)
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;
namespace Vol.SampleForm
{
public partial class frmBase : Form
{
private string childObj;
public frmBase(string _childObj)
{
InitializeComponent();
this.childObj = _childObj;
this.Text = _childObj;
this.label1.Text = _childObj;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.button1.Click += new EventHandler(Save);
}
private void Save(object sender, EventArgs e)
{
string objectToInstantiate = "Vol.SampleForm."+this.childObj+ ", Vol.SampleForm";
var objectType = Type.GetType(objectToInstantiate);
var instantiatedObject = Activator.CreateInstance(objectType) as ITestClass;
// set a property value
instantiatedObject.Name = "Test Name";
// get a property value
var name = instantiatedObject.Name;
// call a method - this outputs "My name is MyNewTestClass"
//Console.Write(instantiatedObject.DoSpecialThing());
MessageBox.Show(instantiatedObject.DoSpecialThing());
}
private void button2_Click(object sender, EventArgs e)
{
string objectToInstantiate = "Vol.SampleForm." + this.childObj + ", Vol.SampleForm";
var objectType = Type.GetType(objectToInstantiate);
var instantiatedObject = Activator.CreateInstance(objectType) as ITestClass;
// set a property value
instantiatedObject.Name = "Test Name";
// get a property value
var name = instantiatedObject.Name;
// call a method - this outputs "My name is MyNewTestClass"
//Console.Write(instantiatedObject.DoSpecialThing());
MessageBox.Show(instantiatedObject.Save());
}
}
public interface ITestClass
{
int Id { get; set; }
string Name { get; set; }
string DoSpecialThing();
string Save();
}
public class Product : ITestClass
{
public int Id { get; set; }
public string Name { get; set; }
public string DoSpecialThing()
{
return "My name is Product";
}
public string Save()
{
//Code บลาๆๆๆๆๆๆ
return "Save Product เด้อ";
}
}
public class Unit : ITestClass
{
public int Id { get; set; }
public string Name { get; set; }
public string Save()
{
//Code บลาๆๆๆๆๆๆ
return "Save Unit เด้อ";
}
public string DoSpecialThing()
{
return "My name is Unit";
}
}
}
อีกนิด
สร้างอีกฟอร์ม คือฟอร์มที่จะเรียกใช้ชื่อ frmMain ก็ได้
และลองสร้าง Button 1 อัน แล้วโค้ดภายในก็ประมาณนี้
Code (C#)
private void button1_Click(object sender, EventArgs e)
{
var frm = new frmBase("Product");
frm.Show();
frm = new frmBase("Unit");
frm.Show();
}
แล้วลองรันดู
ถ้ายังไม่ตรงวัตถุประสงค์ ก็ขออภัยด้วยเด้อครับผม
หรือไม่ก็เขาไปอ่านที่นี้ก็ได้ครับ
https://jeremylindsayni.wordpress.com/2019/02/11/instantiating-a-c-object-from-a-string-using-activator-createinstance-in-net/
|
 |
 |
 |
 |
Date :
2019-06-27 14:52:47 |
By :
บัญดิษฐ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เสริมอีกนิดครับ เดียวจะไม่ใช่ OOP
แก้ไขหน้า frmBase นิดหน่อย
Code (C#)
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;
namespace Vol.SampleForm
{
public partial class frmBase : Form
{
private string childObj;
public frmBase(string _childObj)
{
InitializeComponent();
this.childObj = _childObj;
this.Text = _childObj;
this.label1.Text = _childObj;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.button1.Click += new EventHandler(Save);
}
private void Save(object sender, EventArgs e)
{
string objectToInstantiate = "Vol.SampleForm."+this.childObj+ ", Vol.SampleForm";
var objectType = Type.GetType(objectToInstantiate);
var instantiatedObject = Activator.CreateInstance(objectType) as ITestClass;
// set a property value
instantiatedObject.Details.Name = "Test Name";
// get a property value
var name = instantiatedObject.Details.Name;
// call a method - this outputs "My name is MyNewTestClass"
//Console.Write(instantiatedObject.DoSpecialThing());
MessageBox.Show(instantiatedObject.DoSpecialThing());
}
private void button2_Click(object sender, EventArgs e)
{
string objectToInstantiate = "Vol.SampleForm." + this.childObj + ", Vol.SampleForm";
var objectType = Type.GetType(objectToInstantiate);
var instantiatedObject = Activator.CreateInstance(objectType) as ITestClass;
// set a property value
instantiatedObject.Details.Name = "Test Name";
// get a property value
var name = instantiatedObject.Details.Name;
// call a method - this outputs "My name is MyNewTestClass"
//Console.Write(instantiatedObject.DoSpecialThing());
MessageBox.Show(instantiatedObject.Save());
}
}
public interface ITestClass
{
TempDetails Details { get; set; }
string DoSpecialThing();
string Save();
}
public class Product : ITestClass
{
public TempDetails Details { get; set; } = new TempDetails();
public string DoSpecialThing()
{
return "My name is Product";
}
public string Save()
{
//Code บลาๆๆๆๆๆๆ
return "Save Product เด้อ";
}
}
public class Unit : ITestClass
{
public TempDetails Details { get; set; } = new TempDetails();
public string Save()
{
//Code บลาๆๆๆๆๆๆ
return "Save Unit เด้อ";
}
public string DoSpecialThing()
{
return "My name is Unit";
}
}
public class TempDetails
{
public int Id { get; set; }
public string Name { get; set; }
}
}
หรือไม่ก็ง่ายก็ตามคุณ FONFIRE
|
 |
 |
 |
 |
Date :
2019-06-27 15:15:07 |
By :
บัญดิษฐ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คือที่พยายาม ยึดรูปแบบการเขียนโปรแกรมง่ายๆ เพราะว่าในแล็บ ไม่มี IT ครับ
อย่างน้อยถ้าผมลาออกไปปลูกผัก ก็ยังพอจะมีคนมาจับงานแทนได้
ผมจึงลดโค้ดที่ต้องใช้ ความซับซ้อน หรือ ผลักงานที่ซับซ้อนมากองไว้จุดเดียว ไม่ว่าจะสร้าง ไลบรารี่ขึ้นมา หรือสร้างคลาสขึ้นมา
อีกอย่างคือ เวลาผมเอาโค้ดไปแจกให้คนอื่นใช้งาน หรือ ฝึกเขียนต่อ เขาก็จะได้เขียนง่าย ครับ
ที่ผมใช้ datawizard เป็นหลัก เพราะจะให้มองว่า การเขียนโปรแกรมไม่จำเป็นต้องมาศึกษา sql ขั้นสูง
ขอแค่ตีความต้องการออกเราก็สามารถเขียนโปรแกรมเชื่อมฐานข้อมูลได้ง่ายๆ โดยที่ ไม่ต้องรู้ซะด้วยซ้ำว่า select * from table มันคืออะไร
และโค้ดที่เขียนก็จะพยายาม เขียนให้มันง่ายๆเข้าไว้ สั้นเข้าไว้ครับ
อาทิตย์ ก่อน Auditor มาตรวจแล็บเขาก็บ่น ว่าอยากได้ LIMS ซึ่่งมันราคาแพง
ทั้งๆที่ หากเราจะเจาะจงแค่ผลแล็บมันก็ไม่ยาก
แต่คนที่ทำงานแล็บต้องรู้ก่อนว่าการจะเขียนมันควรเริ่มจากจุดไหนบ้าง
ซึ่งผมอยากจะทำให้จุดนั้นมันง่าย และเรียนรู้ไม่ยากจนเกินไป ครับ
|
ประวัติการแก้ไข 2019-06-27 15:38:46
 |
 |
 |
 |
Date :
2019-06-27 15:32:12 |
By :
lamaka.tor |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
@TOR_CHEMISTRY, ALLS
ถ้าพวกคุณรู้ความจริง พวกคุณจะสงสารผม จนน้ำตาไหลไม่หยุดเลยเชียวแหละ
ผมเป็นพลทหารชั้นเลว ออกรบอยู่แนวหน้า อาวุธมีเพียงจอบและหัวใจ
|
 |
 |
 |
 |
Date :
2019-06-27 15:37:37 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตัวแปร ส่งผ่าน list ครับ จะส่งเป็นค่า หรือจะส่งเป็น pointer ก็ได้หมด
function callback ก็ส่งผ่าน list ได้ครับ จะส่งไปกี่ function ก็ได้
แล้ว อ้างอิง ลิสต์ เอา
อาจจะใช้ตำแหน่ง คู่ 0 2 4 6 ..... เก็บ type ข้อมูล
ตำแหน่งคี่ 1 3 5 7 เก็บ pointer ของ value
ให้เราสร้าง function callback ไว้ที่ class ที่เรียกใช้ template form
จะสร้าง กี่ function ก็ได้ list เก็บได้หมด
ใน template form
เราสามารถ เขียน override Create ได้ จะให้มันรับตัวแปรอะไรก็ได้
สร้างตัวแปร private มาเก็บ function callback สำหรับ Save , delete หรืออะไรก็ได้ว่าไป
ตัวอย่างก็ที่ผมส่งให้นั่นแหล่ะครับ แต่ตัวอย่างมันน้อยไปหน่อย
|
 |
 |
 |
 |
Date :
2019-06-27 16:27:18 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้ากระผมเดาไม่ผิด ความหมายของท่าน Chaidhanan
น่าจะประมาณนี้ใช่ไหมครับ
--- อันนี้เป็นการดึงข้อมูล Json
Code (JavaScript)
async function doAjax(args) {
let result;
try {
result = await $.ajax({
url: ajaxurl,
type: 'POST',
data: args
});
return result;
} catch (error) {
console.error(error);
}
}
//Method 1
const stuff = await doAjax();
//Method 2
doAjax().then((data) => doStuff(data))
|
 |
 |
 |
 |
Date :
2019-06-27 18:21:40 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมชอบความซุกซนของคุณ TOR
--- สิ่งนี้หายากมากฯ
ถ้าคุณ TOR เข้าใจในส่ิงที่คุณ บัญดิษฐ อธิบายมา มันก็จบ ณ.วันนั้น แต่ก็ไม่ใช่ ณ. วันนี้(ปัจจุบัน)
ปล. ผมไม่ได้ข้ามแค่ความสงสัย แต่ผมพยายามข้ามความต้องการของคนอื่นฯ
|
 |
 |
 |
 |
Date :
2019-06-27 18:32:38 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อันนี้ผมไม่ได้ยอ Admin ที่นี่ใจกว้างมาก มากเสียจนกระผมละอายใจตัวเอง
ผมไม่อาย และผมหน้าด้านพอ ที่จะขอโทษทุกทุกคน
ผมเป็นคนที่มีเหตุผลกำกับ
รู้ดี รู้ชั่ว อะไรควร อะไรไม่ควร
กระผมปรารนา อยากจะให้กระทุ้นี้เป็นตำนานของ www.thaicreate.com
ขอบคุณสำหรับทุกฯท่านครับ ที่มอบความสุขให้กับกระผม
... ของผมมีความหมาย และจะเป็นคุณมากเสียกว่าเป็นโทษ
|
 |
 |
 |
 |
Date :
2019-06-27 18:43:24 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
@บัญดิษฐ, @fonfire, @Chaidhanan, @TOR
--- ผมมีโลกส่วนตัวอยู่ที่ [email protected] ถ้าคุณอยากจะด่าผมมาได้เลยครับตามสะดวก แต่ถ้าจะชมก็ไม่จำเป็ฯต้องมา
ณ. ที่แห่งนั้นของผม มีแต่ได้กลับไป ไม่มีเสีย และที่แห่งนั้นกระผมเป็นสุถาพชน ทุกฯ สถานะการณ์
|
 |
 |
 |
 |
Date :
2019-06-27 19:01:21 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
โอ๊วววววววววววววววววววววววววววว
งั้นเดี๋ยวขอแก้ CAR ตัวนี้ให้เสร็จก่อนนะครับ
รอบหน้าจะรื้อ ความรู้ และ โค้ด ใหม่ดูครับ
|
 |
 |
 |
 |
Date :
2019-06-27 19:53:45 |
By :
lamaka.tor |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|