Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 108,456

HOME > .NET Framework > Forum > C# WinApp งงกับ BindingSource และ DataGridView ครับ



 

C# WinApp งงกับ BindingSource และ DataGridView ครับ

 



Topic : 129437



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook



คือ ผมสร้างหน้าค้นหาโดยใช้ BindingSource และ DataGridView

โค้ด ประมาณนี้ครับ

Code (C#)
this.tblReagent_rTableAdapter.Fill(this.dataDataSet.tblReagent_r);
           // biIDTextBox.Enabled = false;
            if (biID == "")
            {
            tblReagent_rBindingSource.Filter = "biID IS NULL";
            tblReagent_rBindingSource.AddNew();
           
            }
            else
            {
            biIDTextBox.Text = biID;
            tblReagent_rBindingSource.Filter = "biID = '" + biID + "'";
            }


โดยที่รับ biID มาแล้วก็ค้นหา จาก
Code (C#)
tblReagent_rBindingSource.Filter = "biID = '" + biID + "'";

จะได้ดังรูปครับ
1
ทีนี้ถ้า User จะเปลี่ยน biID ใน DataGridView


Code (C#)
private void button2_Click(object sender, EventArgs e)
        {
         for (int i = 0; i < tblReagent_rDataGridView.RowCount - 1; i++)
         {
         tblReagent_rDataGridView[1, i].Value = biIDTextBox.Text;
         }

        }


ซึ่ง ยังไม่ได้บันทึกหรือแก้ไข tblReagent_rBindingSource นะครับ
ผลที่ได้ก็ออกมาเป็นแบบนี้
2

คือมันเปลี่ยนไม่หมด และ แถวยังหายไปด้วย ครับ



Tag : .NET, Win (Windows App), C#, VS 2013 (.NET 4.x)







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2017-11-08 09:46:05 By : lamaka.tor View : 1176 Reply : 11
 

 

No. 1



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ดันๆๆ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-11 17:00:15 By : lamaka.tor
 


 

No. 2



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


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 : ขาจร
 

 

No. 3



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 2 เขียนโดย : ขาจร เมื่อวันที่ 2017-11-11 18:04:55
รายละเอียดของการตอบ ::
ถ้า Update หรือ Insert แล้วค่อยมา filter ใหม่ก็ได้อยู่ครับ
แต่อยากให้ User ตรวจสอบใน datagrid ก่อนที่จะ บันทึก

ปัญหาติดตรงที่ว่า

Code (C#)
tblReagent_rBindingSource.Filter = "biID = '" + biID + "'";


แล้ว พอ แก้ที่ DataGridView ก็แก้ตรง คอลัม biID ด้วยทำให้มีปัญหาครับ
ไม่รู้ว่าต้องแก้ยังไงเหมือนกันครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-11 19:16:36 By : lamaka.tor
 


 

No. 4



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


ได้คำตอบแล้วครับ ปัญหาอยู่ที่ 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 : ขาจร
 


 

No. 5



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


ลืมไปว่าถ้า DataGridView ว่างเปล่า ใช้ค่า ID จาก textbox มาแสดงแทนนะครับ เพราะ biID น่าจะเป็นค่าเก่าจากการค้นหา(ก่อนแก้ไข)

Code (C#)
tblReagent_rBindingSource.Filter = "biID = '" + biIDTextBox.Text + "'";

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-13 00:04:34 By : ขาจร
 


 

No. 6



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 4 เขียนโดย : ขาจร เมื่อวันที่ 2017-11-12 21:03:09
รายละเอียดของการตอบ ::
ในกรณีที่เราจัดการใน DataSet เราจะไม่สามารถจัดการในส่วนของ การเพิ่มข้อมูลได้นะครับ นอกจาก เราจะใช้วิธี
Code (C#)
this.tblReagent_rTableAdapter.Insert(...........);




แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-13 08:34:53 By : lamaka.tor
 


 

No. 7



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


ไม่ว่าจะเพิ่ม ลบ แก้ไข ใน 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 : ขาจร
 


 

No. 8



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ไฟล์ที่ให้มา ติด 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
 


 

No. 9



โพสกระทู้ ( 819 )
บทความ ( 0 )



สถานะออฟไลน์


ออกตัวก่อนน่ะครับ
ว่าไม่เคยใช้ตัว 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
 


 

No. 10



โพสกระทู้ ( 4,071 )
บทความ ( 23 )



สถานะออฟไลน์
Facebook

ได้แล้วครับ
ผมลืม rrID ตามที่ท่าน fonfire ว่าจริงๆ ครับ

ขอบคุณทั้ง 2 ท่านมากๆ ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2017-11-13 15:50:12 By : lamaka.tor
 


 

No. 11



โพสกระทู้ ( 280 )
บทความ ( 0 )



สถานะออฟไลน์


อ้าวเฮ...มาเก็บข้อมูลครับ ขอบคุณไอเดีย จขกท.นะครับ..

ขอบคุณคุณ 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 : ขาจร
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : C# WinApp งงกับ BindingSource และ DataGridView ครับ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม , รับทำบัญชี , โรงงานผลิตครีม , สำนักงานบัญชี , รับจดทะเบียนบริษัท , Pangpond , รถมือสอง

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2020 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่