|
|
|
C# WinApp งงกับ BindingSource และ DataGridView ครับ |
|
|
|
|
|
|
|
ดันๆๆ
|
|
|
|
|
Date :
2017-11-11 17:00:15 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bind ข้อมูลเป็น DataTable ลองเปลี่ยนค่าจาก DataTable ดูครับ
https://msdn.microsoft.com/en-us/library/system.data.datatable(v=vs.110).aspx
|
|
|
|
|
Date :
2017-11-11 18:04:55 |
By :
ขาจร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้คำตอบแล้วครับ ปัญหาอยู่ที่ click event
การแก้ไขค่าในเซลล์โดยตรงจะสามารถทำได้ก็ต่อเมื่อ DataGridView นั้น ไม่ได้ bind ข้อมูลจาก DataTable หรือ Database เพราะฉะนั้น คำสั่งนี้
Code (C#)
tblReagent_rDataGridView[1, i].Value = biIDTextBox.Text;
จึงไม่มีผลต่อ DataGridView เพราะถูกยึดไว้กับ DataTable ด้วย BindingSource
ทางออกคือ แก้ไขค่าใน DataTable แทน เพราะจากโค้ดเป็นการ bind ข้อมูลจาก DataTable(ตารางข้อมูลแบบชั่วคราว) ซึ่งดึงมาจาก Database(ข้อมูลถาวร) อีกที ดังนั้น เมื่อเราแก้ไขค่าต่างๆ ใน DataTable กไม่ต้องกลัวว่า ค่าใน DataBase จะเปลี่ยนตาม...เอาแบบง่ายๆ คือ มันจะไม่บันทึกข้อมูลใหม่ลงในฐานข้อมูลนั่นเอง
Code (C#)
private void button2_Click(object sender, EventArgs e)
{
// เก็บค่า ID ของ "เลขที่ใบส่ง" ที่จะแก้ไขไว้ใน string array (หรือจะใช้ List ก็ได้
// เพื่อแก้ปัญหาการลดค่าของจำนวนแถวซึ่งจะทำให้ค่า i ในคำสั่ง tblReagent_rDataGridView[0, i] คลาดเคลื่อน
string[] strID = new string[tblReagent_rDataGridView.RowCount - 1];
for (int i = 0; i < tblReagent_rDataGridView.RowCount - 1; i++)
{
strID[i] = tblReagent_rDataGridView[0, i].Value.ToString();
}
// เก็บค่าจำนวนแถวทั้งหมดไว้ที่ count ก่อนเพื่อแก้ปัญหา RowCount ไม่คงที่
// เพราะค่าจาก DataGridView.RowCount จะลดลงทีละ 1 ทุกรอบของการเข้าลูป
int count = tblReagent_rDataGridView.RowCount - 1;
for (int i = 0; i < count; i++)
{
DataRow[] selected = dataDataSet.tblReagent_r.Select("ID = " + strID[i]);
foreach (DataRow row in selected)
{
row["เลขที่ใบส่ง"] = biIDTextBox.Text;
}
}
// แสดงข้อมูลใหม่ใน DataGidView
tblReagent_rBindingSource.Filter = "biID = '" + biID + "'";
// ลบแถวล่างสุดที่เกินมา
tblReagent_rDataGridView.Rows.RemoveAt(count);
}
ปล.การรับค่า biID อาจไม่เหมือนกับตัวอย่างเป๊ะ แต่กระบวนการแก้ไขข้อมูลคงไม่ต่างกัน...ยังไงลองดูก่อนครับ
|
|
|
|
|
Date :
2017-11-12 21:03:09 |
By :
ขาจร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลืมไปว่าถ้า DataGridView ว่างเปล่า ใช้ค่า ID จาก textbox มาแสดงแทนนะครับ เพราะ biID น่าจะเป็นค่าเก่าจากการค้นหา(ก่อนแก้ไข)
Code (C#)
tblReagent_rBindingSource.Filter = "biID = '" + biIDTextBox.Text + "'";
|
|
|
|
|
Date :
2017-11-13 00:04:34 |
By :
ขาจร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ว่าจะเพิ่ม ลบ แก้ไข ใน Database หรือ DataTable ทำได้ครับ แต่อาจใช้ชุดคำสั่งต่างกัน อย่างคำสั่งนี้
this.tblReagent_rTableAdapter.Insert(...........);
เป็นการใช้ TableAdapter เป็นสะพานเพื่อเขียนหรือแก้ไขข้อมูลใน Database เลย
ส่วนการเขียนข้อมูลลงใน DataTable สามารถใช้เมธอด NewRow() ได้ครับ
https://msdn.microsoft.com/en-us/library/5ycd1034.aspx
ซึ่งเป็นคำถามใหม่
ส่วนประเด็นตามหัวข้อกระทู้ ขอเพิ่มเติมโปรแกรมตัวอย่าง เพื่อเป็นกรณีศึกษาต่อไปครับ
C#_Dataset_Edit
โปรแกรมนี้เป็นตัวอย่างการแก้ไขข้อมูลที่แสดงใน DataGridview แบบทั้งคอลัมน์(แก้ทุกแถวในคอลัมน์ที่กำหนด) ซึ่งหลักการคือแก้ไขจาก DataTable ที่อยู่ใน Dataset แล้วใช้ BindingSource เพื่อ refresh ข้อมูลใหม่ โดยใช้โค้ดเดียวกับ คห. No.4 แต่ฟังก์ชันการทำงานในมุมของ user จะต่างจากของ จขกท.เล็กน้อย
วิธีทดสอบโปรแกรม
เมื่อเปิดโปรแกรมข้อมูลที่แสดงใน DataGridView คือข้อมูลทั้งหมดจากฐานข้อมูล การทำงานจะมีสองโหมดคือ View Mode และ Edit Mode
View Mode เป็นโหมดการค้นหาโดยใช้ TextBox_TextChanged Event เมื่อ user เปลี่ยนรหัส Model ใหม่ตารางจะว่างเปล่าถ้าไม่พบข้อมูลจาก DataTable และแสดงข้อมูลตามจำนวนเมื่อค้นเจอ ตัวอย่าง Model มีทั้งหมดสองค่า "111111" กับ "222222"...ลองเลือกใส่ค่าใดค่าหนึ่งเพื่อทำการค้นหา เมื่อข้อมูลแสดงในตารางแล้วให้กด Enter เพื่อเปลี่ยนไปใช้โหมดแก้ไข Edit Mode ซึ่งใช้ Label เป็นตัวบอกสถานะของโหมด ถ้าเปลี่ยนใจให้กด Enter อีกครั้งเพื่อกลับสู่ View Mode เพื่อค้นหา Model ใหม่ เมื่อได้ที่ถูกใจแล้วใน Edit Mode ใส่ค่า Model ใหม่(สังเกตว่าการแก้ไขค่าใน textbox สำหรับโหมดนี้ตารางจะไม่มีการเปลี่ยนแปลงในขณะพิมพ์) แล้วคลิกปุ่ม Edit โปรแกรมก็จะแก้ค่า Model ใน DataTable และนำข้อมูลมาแสดงใหม่ผ่าน BindingSource จากนั้นก็จะกลับไปใช้ View Mode เอง...ข้อมูลแก้ไขเรียบร้อย(ชั่วคราว) แต่ยังไม่ได้บันทึกลงในฐานข้อมูล พิสูจน์โดยออกจากโปรแกรมแล้วเข้าใหม่จะเห็นว่าข้อมูลยังอยู่เหมือนเดิม...ถ้าจะเปลี่ยนข้อมูลใน Database ต้องใช้ Adapter หรือในมุมของ user คือกดปุ่ม save แต่ในโปรแกรมนี้ผมไม่ได้ใส่โค้ดเอาไว้ เพราะไม่ใช่ส่วนที่เรากำลังศึกษา...ยังไงลองเล่นๆ ดูครับ
|
|
|
|
|
Date :
2017-11-13 11:36:42 |
By :
ขาจร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไฟล์ที่ให้มา ติด Error หลายตัวครับ
ส่วน
Code (C#)
private void button2_Click(object sender, EventArgs e)
{
// เก็บค่า ID ของ "เลขที่ใบส่ง" ที่จะแก้ไขไว้ใน string array (หรือจะใช้ List ก็ได้
// เพื่อแก้ปัญหาการลดค่าของจำนวนแถวซึ่งจะทำให้ค่า i ในคำสั่ง tblReagent_rDataGridView[0, i] คลาดเคลื่อน
string[] strID = new string[tblReagent_rDataGridView.RowCount - 1];
for (int i = 0; i < tblReagent_rDataGridView.RowCount - 1; i++)
{
strID[i] = tblReagent_rDataGridView[0, i].Value.ToString();
}
// เก็บค่าจำนวนแถวทั้งหมดไว้ที่ count ก่อนเพื่อแก้ปัญหา RowCount ไม่คงที่
// เพราะค่าจาก DataGridView.RowCount จะลดลงทีละ 1 ทุกรอบของการเข้าลูป
int count = tblReagent_rDataGridView.RowCount - 1;
for (int i = 0; i < count; i++)
{
DataRow[] selected = dataDataSet.tblReagent_r.Select("ID = " + strID[i]);
foreach (DataRow row in selected)
{
row["เลขที่ใบส่ง"] = biIDTextBox.Text;
}
}
// แสดงข้อมูลใหม่ใน DataGidView
tblReagent_rBindingSource.Filter = "biID = '" + biID + "'";
// ลบแถวล่างสุดที่เกินมา
tblReagent_rDataGridView.Rows.RemoveAt(count);
}
ติดปัญหาเดิมครับ
ลองดูให้หน่อยครับ
https://drive.google.com/open?id=1hkneTq5zJoBatIEWBEgqx3jCc9kVrjea
|
|
|
|
|
Date :
2017-11-13 14:06:31 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ออกตัวก่อนน่ะครับ
ว่าไม่เคยใช้ตัว Wizard
Code ที่ให้มา ผิดตรงที่ Select ครับ
คำสั่งชุดบนเก็บค่า ฟิลด์ที่ 1 ซื่งชื่อฟิลด์จะเป็น rrID ครับ
แต่ตรงเลือกข้อมูล .Select
ใช้เป็น biID
Code (C#)
string[] strID = new string[tblReagent_rDataGridView.RowCount - 1];
for (int i = 0; i < tblReagent_rDataGridView.RowCount - 1; i++)
{
strID[i] = tblReagent_rDataGridView[0, i].Value.ToString();
}
// เก็บค่าจำนวนแถวทั้งหมดไว้ที่ count ก่อนเพื่อแก้ปัญหา RowCount ไม่คงที่
// เพราะค่าจาก DataGridView.RowCount จะลดลงทีละ 1 ทุกรอบของการเข้าลูป
int count = tblReagent_rDataGridView.RowCount - 1;
tblReagent_rBindingSource.Filter = "";
for (int i = 0; i < count; i++)
{
string _x;
_x = "rrID = " + strID[i] ;
DataRow[] selected = dataDataSet.tblReagent_r.Select(_x);
int xx;
xx=selected.Length;
foreach (DataRow row in selected)
{
row[1] = this.textBox1.Text;
}
}
|
|
|
|
|
Date :
2017-11-13 15:29:54 |
By :
fonfire |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้แล้วครับ
ผมลืม rrID ตามที่ท่าน fonfire ว่าจริงๆ ครับ
ขอบคุณทั้ง 2 ท่านมากๆ ครับ
|
|
|
|
|
Date :
2017-11-13 15:50:12 |
By :
lamaka.tor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อ้าวเฮ...มาเก็บข้อมูลครับ ขอบคุณไอเดีย จขกท.นะครับ..
ขอบคุณคุณ FONFIRE ด้วยครับ สำหรับความรู้ใหม่
ทีแรกผมเดาค่า biID ผิด...อันนี้ไว้สำหรับผู้ผ่านเข้ามาศึกษา
เวอร์ชันเค้าโครงเดิม
Code (C#)
private void button2_Click(object sender, EventArgs e)
{
// เก็บค่า ID ของ "เลขที่ใบส่ง" ที่จะแก้ไขไว้ใน string array (หรือจะใช้ List ก็ได้)
// เพื่อแก้ปัญหาการลดค่าของจำนวนแถวซึ่งจะทำให้ค่า i ในคำสั่ง tblReagent_rDataGridView[0, i] คลาดเคลื่อน
string[] strID = new string[tblReagent_rDataGridView.RowCount - 1];
for (int i = 0; i < tblReagent_rDataGridView.RowCount - 1; i++)
{
strID[i] = tblReagent_rDataGridView[0, i].Value.ToString();
}
// เก็บค่าจำนวนแถวทั้งหมดไว้ที่ count ก่อนเพื่อแก้ปัญหา RowCount ไม่คงที่
// เพราะค่าจาก DataGridView.RowCount จะลดลงทีละ 1 ทุกรอบของการเข้าลูป
int count = tblReagent_rDataGridView.RowCount - 1;
for (int i = 0; i < count; i++)
{
// เลือก ID ที่จะทำการแก้ไขจาก DataTable...(tblReagent_r)
// ID เป็นแค่ HeaderText ของ tblReagent_rDataGridView เราต้องใช้ Header จาก tblReagent_r
// หรือใน Preview Data คือค่า DataPropertyName ของคอลัมน์ ID ซึ่งก็คือ "rrID"
DataRow[] selected = dataDataSet.tblReagent_r.Select("rrID = " + strID[i]);
foreach (DataRow row in selected) // เช็คทีละแถว
{
// biID คือ DataPropertyName ของ "เลขที่ใบส่ง"
// หรืออีกความหมายหนึ่ง "เลขที่ใบส่ง" ก็คือคอลัมน์ biID ใน tblReagent_r
row["biID"] = this.textBox1.Text; // แก้ "เลขที่ใบส่ง"(biID) ตาม TextBox1
}
}
// แสดงข้อมูลใหม่ใน DataGidView
tblReagent_rBindingSource.Filter = "biID = '" + this.textBox1.Text + "'";
// ลบแถวล่างสุดที่เกินมา
// tblReagent_rDataGridView.Rows.RemoveAt(count);
}
|
|
|
|
|
Date :
2017-11-13 16:10:26 |
By :
ขาจร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 03
|