ds.Tables.Rows.Add() สร้าง 3 แถวเมื่อถูกเรียกครั้งเดียว

[หมายเหตุ อัปเดต:]

ความปรารถนาของฉันคือให้ผู้ใช้เพิ่มแถวใหม่ลงใน DataGridview (DGV) จะสามารถสร้างแถวนั้นในฐานข้อมูล Access ได้ และเพื่อให้สามารถสร้างหลายแถวและการแก้ไขแบบไม่ซิงโครนัสในแถวใหม่เหล่านั้นได้ DGV กำลังเต็มไปด้วยตารางชุดข้อมูล และฉันพบว่าการมีชุดข้อมูลระหว่าง DGV และฐานข้อมูลเป็นแนวทางปฏิบัติที่ดีที่สุด (หรืออย่างน้อยก็ช่วยให้มีความยืดหยุ่น)

หากต้องการแก้ไขแถวใหม่ที่สร้างโดยผู้ใช้หลายราย ชุดข้อมูลจะต้องสามารถดึงคีย์หลักที่เพิ่มขึ้นอัตโนมัติจากฐานข้อมูล จากนั้นเติม DGV ด้วยค่าคีย์ที่อัปเดตสำหรับแถวใหม่ หรืออย่างน้อยนั่นคือวิธีเดียวที่ฉันพบว่ามีงานนี้ ปัญหาคือเมื่อฉันพยายามเพิ่มแถวลงใน DataTable มันกลายเป็นสามแถวแทนที่จะเป็นแถวเดียว


[กระทู้เก่าลบเพื่อความกระชับ]

ต่อไปนี้คือวิธีการเติม DGV และเชื่อมโยงกับชุดข้อมูลเป็นครั้งแรก:

Dim ConMain As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MasterPath)
Dim ds As New DataSet

Public Sub UniversalFiller(ByVal QueryStringFill As String, ByVal DGV As DataGridView, ByVal AccessDBTableName As String)
    If IsNothing(ds.Tables(AccessDBTableName)) Then
    Else
        ds.Tables(AccessDBTableName).Clear()
    End If
    ConMain.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MasterPath
    Dim daZZ As New OleDbDataAdapter(QueryStringFill, ConMain)
    Try
        daZZ.Fill(ds, AccessDBTableName)
        DGV.DataSource = ds
        DGV.DataMember = AccessDBTableName
        DGV.AutoResizeColumns()
    Catch ex As Exception
        WriteToErrorLog(ex.Message, ex.StackTrace, ex.GetHashCode, ex.Source, ex.ToString)
        ds.Clear
        MsgBox("There was an error filling the DGV, ds.cleared") 'this is for my notes, not user error'
    End Try

End Sub

อัปเดต:

ฉันยังไม่สามารถเข้าใจปัญหานี้ได้ สิ่งนี้เรียกว่าเมื่อการจัดการ DGV.UserAddedRow ฉันได้เรียนรู้ว่า รหัสต้นฉบับอาจไม่ใช่วิธีที่ดีที่สุดในการเพียงแค่เพิ่ม 1 แถว แต่ถึงกระนั้นการทำให้แถวใหม่ประสบปัญหาเดียวกัน:

Dim daZZ As New OleDbDataAdapter(DBSelectQuery, ConMain)
Dim CurrentCellPoint As Point = DGV.CurrentCellAddress
Dim CurrentCellText As String = DGV.CurrentCell.Value.ToString
Dim cmdBldr As New OleDbCommandBuilder(daZZ)
cmdBldr.QuotePrefix = "["
cmdBldr.QuoteSuffix = "]"
MsgBox("1")
Dim DaZZDataRow As DataRow = ds.Tables(DTName).NewRow
MsgBox("2")
DaZZDataRow(CurrentCellPoint.X) = CurrentCellText
MsgBox("3")
ds.Tables(DTName).Rows.Add(DaZZDataRow)
MsgBox("4")
daZZ.InsertCommand = cmdBldr.GetInsertCommand()
MsgBox("5")
daZZ.Update(ds.Tables(DTName))
MsgBox("6")
ds.Tables(DTName).Clear()
daZZ.Fill(ds, DTName)
MsgBox("5")
daZZ.Update(ds.Tables(DTName))
DGV.CurrentCell = DGV(CurrentCellPoint.X, CurrentCellPoint.Y)

ปัญหาอยู่ที่ขั้นตอน ds.Tables(DTName).Rows.Add() เสมอ ไม่สำคัญว่าจะใส่อะไรไว้ในวงเล็บบน .Add() อาจเป็นตัวเลขหรือจำนวนเต็มใดๆ รวมทั้ง 0 และจะมี 3 แถว มันไม่ได้ถูกเรียกหลายครั้ง แค่โทรหา ds.Tables(DTName).Rows.Add()

ถ้านั่นไม่ใช่วิธีที่ถูกต้องในการเพิ่มแถวว่างหนึ่งแถว อะไรคืออะไร? ฉันสามารถโพสต์คำสั่ง SQL insert/update ได้ แต่นั่นไม่ใช่ปัญหาเนื่องจากการเพิ่มสร้างสามแถว ไม่ใช่ 1 เพื่อให้ชัดเจน มันจะทำงานผ่านรายการ MsgBox เพียงครั้งเดียวและให้ผล 3 แถว

อยากรู้เหมือนกันว่าคำสั่ง InsertAt ให้ผลลัพธ์เดียวกัน:

ds.Tables(DTName).Rows.InsertAt(DaZZDataRow, CurrentCellPoint.Y) แทนที่จะเป็น ds.Tables(DTName).Rows.Add() ยังคงให้ผล 3 แถวใหม่ ฉันได้ลองสิ่งนี้กับฐานข้อมูลเริ่มต้นใหม่จาก Access แล้วพบปัญหาเดียวกัน

นี่คือตัวอย่างการทำงานของโค้ด ในฐานะ VS2012 Project plus dummy ฐานข้อมูล แม้จะค่อนข้างเรียบง่าย กล่าวคือ ไม่มีการจัดการข้อผิดพลาด แต่จะแสดงข้อผิดพลาดและยังช่วยให้สามารถลบแถวได้เพื่อเพิ่มความสะดวกอีกด้วย ขอบคุณใครก็ตามที่เข้ามาดู


person Atl LED    schedule 14.10.2013    source แหล่งที่มา
comment
อืม คุณแน่ใจหรือว่าไม่มีการคลิก 3 ปุ่ม? ทริกเกอร์บนโต๊ะ?   -  person Yosi Dahari    schedule 15.10.2013
comment
@Yosi ใช่ สิ่งนี้จะเกิดขึ้นเมื่อคุณพยายามเขียนในเซลล์แถวใหม่   -  person Atl LED    schedule 15.10.2013
comment
ฉันคิดว่าสิ่งที่ Yosi ถามที่นี่คือฟังก์ชันถูกเรียกสามครั้งด้วยเหตุผลบางอย่างหรือไม่ คุณสามารถยืนยันได้อย่างง่ายดายโดยการใส่ Msgbox (เพิ่งเรียกใช้ฟังก์ชันนี้) ลงในโค้ดและดูว่าจะเกิดอะไรขึ้นเมื่อคุณคลิกปุ่มหนึ่งครั้ง หากเป็นเช่นนั้น แสดงว่ามีสิ่งผิดปกติเกิดขึ้นกับอินเทอร์เฟซ หากไม่เป็นเช่นนั้น แสดงว่ามีบางอย่างผิดปกติกับโค้ดอัปเดตข้อมูล ขั้นตอนแรกของคุณคือการจำกัดให้แคบลงว่าพฤติกรรมที่ไม่คาดคิดมาจากไหน   -  person nucleon    schedule 11.12.2013
comment
@nucleon ขอบคุณสำหรับข้อเสนอแนะ และฉันก็ลองแล้ว มันขึ้นมาพร้อมกับกล่องข้อความเดียวเท่านั้น ฉันยังคงงงงวยกับสิ่งนี้อย่างจริงจัง วิธีแก้ไขของฉันคือการลบสองแถวทันที แต่มันหยาบคาย   -  person Atl LED    schedule 06.01.2014
comment
@nucleon ฉันเพิ่งโพสต์โค้ดที่อัปเดต ฉันคิดว่าตามสิ่งที่คุณและ Yosi แนะนำ จริง ๆ แล้วไม่ได้รับสายถึง 3 ครั้ง มีความคิดหรือปัญหาอื่นใดอีกบ้าง?   -  person Atl LED    schedule 15.01.2014
comment
@Yosi ฉันไม่ได้เพิ่มทริกเกอร์ใด ๆ ลงในตารางฐานข้อมูลเป็นฐานข้อมูล Access ดังนั้นจึงสามารถรับทริกเกอร์โดยอัตโนมัติจากที่นั่นได้หรือไม่   -  person Atl LED    schedule 15.01.2014
comment
คุณสามารถวางไฟล์ zip พร้อมตัวอย่างการทำงาน รหัส และฐานข้อมูลการเข้าถึงได้หรือไม่   -  person Fredou    schedule 16.01.2014
comment
@Fredou VS2012 Solution + access db จะเหมาะกับคุณหรือไม่ ฉันจะสร้างเวอร์ชันจำลองอย่างรวดเร็ว   -  person Atl LED    schedule 16.01.2014
comment
@Fredou เพิ่งเพิ่มโครงการตัวอย่าง ดูลิงค์ที่ด้านล่างของคำถาม ขออภัยที่ล่าช้า ฉันดำเนินการเสร็จไม่นานหลังจากที่คุณร้องขอ แต่จากนั้นก็ถูกดึงออกจากคอมพิวเตอร์ไปตลอดกะที่เหลือ   -  person Atl LED    schedule 16.01.2014
comment
ขออภัย ฉันไม่สามารถเปิดโครงการของคุณได้เนื่องจากฉันยังอยู่ใน VS2010 อย่างไรก็ตาม นอกเหนือจากการเพิ่มแถวในเรื่องสามเท่าแล้ว วัตถุประสงค์อื่นเมื่อคุณเพิ่มแถวใหม่ลงใน DataGridView จะได้รับการอัปเดตด้วย AutoNumber ID ของระเบียนที่แทรกใหม่หรือไม่ (ถ้าเป็นเช่นนั้นฉันอาจช่วยคุณได้)   -  person Gord Thompson    schedule 16.01.2014
comment
@GordThompson นั่นคือเป้าหมายสุดท้ายของฉันจริง ๆ และการเพิ่มแถวเป็นสามเท่าเป็นข้อผิดพลาดที่ฉันพบตลอดทาง หากฉันจัดการกับความผิดนั้นไปพร้อมๆ กัน ฉันอยากจะถูกเดินไปในเส้นทางที่ถูกต้อง   -  person Atl LED    schedule 16.01.2014


คำตอบ (2)


ฉันใช้วิธีการกลับไปสู่พื้นฐานสำหรับคำถามนี้ โดยเน้นไปที่ปัญหาของการให้ DataGridView แสดงค่า AutoNumber ID ที่สร้างขึ้นเมื่อฉันเพิ่มบันทึกใหม่ ฉันเริ่มต้นด้วยการเพิ่มตัวควบคุม DataGridView ลงในแบบฟอร์มของฉัน และใช้ตัวช่วยสร้าง "เพิ่มแหล่งข้อมูลโครงการ..." เพื่อเชื่อมต่อกับตารางชื่อ [Chemicals] ในฐานข้อมูล Access ของฉัน "Database1.accdb" (โค้ดตัวอย่างเวอร์ชันก่อนหน้าในคำถามอ้างถึงตารางชื่อ [เคมีภัณฑ์] นั่นคือสิ่งที่ฉันใช้)

เมื่อฉันเสร็จแล้วฉันมี "สิ่งของ" ต่อไปนี้ในโครงการของฉัน:

  • ตัวควบคุม DataGridView (dataGridView1) ในแบบฟอร์มของฉันซึ่งเชื่อมโยงกับ BindingSource (ดูด้านล่าง)

  • ชุดข้อมูล (database1DataSet) ที่เกี่ยวข้องกับฐานข้อมูล Access ของฉัน

  • BindingSource (chemicalsBindingSource) ที่เกี่ยวข้องกับตาราง [สารเคมี] ใน database1DataSet เพื่อทำหน้าที่เป็น DataSource สำหรับ DataGridView ของฉัน

  • TableAdapter (chemicalsTableAdapter) เพื่อจัดการการไหลของข้อมูลระหว่างชุดข้อมูลและฐานข้อมูลจริง

ตัวช่วยสร้างยังให้บรรทัดโค้ดต่อไปนี้แก่ฉันในวิธี Form1_Load ของฉัน (ฉันใช้ C# แต่ VB.NET จะคล้ายกันมาก)

// TODO: This line of code loads data into the 'database1DataSet.Chemicals' table. You can move, or remove it, as needed.
this.chemicalsTableAdapter.Fill(this.database1DataSet.Chemicals);

นั่นคือทั้งหมดที่ฉันต้องใช้ในการเรียกใช้แอปพลิเคชันและดูบันทึกที่มีอยู่ใน DataGridView ของฉัน

ตอนนี้ เพื่อส่งการอัปเดต DataGridView กลับไปยังฐานข้อมูลและดึงค่า AutoNumber สำหรับบันทึกที่สร้างขึ้นใหม่ ฉันใช้เหตุการณ์ RowLeave ฉันพบว่าเหตุการณ์ UserAddedRow เริ่มทำงานเร็วเกินไป (ทันทีหลังจากที่ผู้ใช้เริ่มพิมพ์ในแถวใหม่) และฉันต้องการรอจนกว่าผู้ใช้จะแก้ไขแถวเสร็จก่อนที่จะทำอะไรกับมัน

รหัสที่ฉันใช้มีดังนี้ (อีกครั้ง C#)

private void Form1_Load(object sender, EventArgs e)
{
    fillErUp();
}

private void fillErUp()
{
    // (moved from Form1_Load to its own method so it could also be called from _RowLeave, below)
    // TODO: This line of code loads data into the 'database1DataSet.Chemicals' table. You can move, or remove it, as needed.
    this.chemicalsTableAdapter.Fill(this.database1DataSet.Chemicals);
}

private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    if (dgv.IsCurrentRowDirty)
    {
        Cursor.Current = Cursors.WaitCursor;
        dgv.EndEdit();  // flush changes from DataGridView to BindingSource
        chemicalsBindingSource.EndEdit();  // flush changes from BindingSource to DataSet
        this.chemicalsTableAdapter.Update(this.database1DataSet);  // update database
        int currentRow = e.RowIndex;
        if (Convert.ToInt32(dgv.Rows[currentRow].Cells[0].Value) < 0)
        {
            // negative AutoNumber value indicates that the row has just been added
            int currentCol = e.ColumnIndex;
            fillErUp();  // re-fill the table in the DataSet, and hence the DataGridView as well
            dgv.CurrentCell = dataGridView1[currentCol, currentRow];
        }
        Cursor.Current = Cursors.Default;
    }
}

นี่ไม่ใช่รหัสการผลิตที่สมบูรณ์ แต่ฉันหวังว่ามันจะช่วยได้

แก้ไขอีกครั้ง: ความเห็น

ฉันลองใช้โซลูชันก่อนหน้านี้อีกครั้งเพื่อดูว่าฉันสามารถบรรลุผลลัพธ์เดียวกันได้หรือไม่โดยไม่ต้องอาศัย "เวทย์มนตร์" ของ Visual Studio แนวทางของฉันในครั้งนี้คือ:

  • ฉันเปิดโครงการ C# Windows Forms ใหม่

  • ฉันลากและวางวัตถุ DataSet, วัตถุ BindingSource และวัตถุ DataGridView ลงในแบบฟอร์มเปล่า มีชื่อว่า dataSet1, bindingSource1 และ dataGridView1 ตามลำดับ

  • ฉันสร้างตัวจัดการเหตุการณ์ Form1_Load และ dataGridView1_RowLeave แล้วเพิ่มโค้ดของตัวเองที่มีลักษณะดังนี้:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace dgvTest2
{
    public partial class Form1 : Form
    {
        OleDbConnection con = new OleDbConnection();
        OleDbDataAdapter da = new OleDbDataAdapter();
        OleDbCommandBuilder cb;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Public\Database1.accdb";
            con.Open();
            da.SelectCommand = new OleDbCommand("SELECT * FROM Chemicals", con);
            cb = new OleDbCommandBuilder(da);
            cb.QuotePrefix = "["; cb.QuoteSuffix = "]";
            this.dataSet1.Tables.Add(new DataTable("Chemicals"));
            this.bindingSource1.DataSource = this.dataSet1;
            this.bindingSource1.DataMember = "Chemicals";
            this.dataGridView1.DataSource = this.bindingSource1;
            fillErUp();
        }

        private void fillErUp()
        {
            this.dataSet1.Tables["Chemicals"].Clear();
            da.Fill(this.dataSet1.Tables["Chemicals"]);
        }

        private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView dgv = (DataGridView)sender;
            if (dgv.IsCurrentRowDirty)
            {
                Cursor.Current = Cursors.WaitCursor;
                dgv.EndEdit();  // flush changes from DataGridView to BindingSource
                bindingSource1.EndEdit();  // flush changes from BindingSource to DataSet
                da.Update(this.dataSet1.Tables["Chemicals"]);  // update database
                int currentRow = e.RowIndex;
                if (dgv.Rows[currentRow].Cells[0].Value == DBNull.Value)
                {
                    // a null ID value indicates that the row has just been added
                    int currentCol = e.ColumnIndex;
                    fillErUp();  // re-fill the table in the DataSet, and hence the DataGridView as well
                    dgv.CurrentCell = dataGridView1[currentCol, currentRow];
                }
                Cursor.Current = Cursors.Default;
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            con.Close();
        }
    }
}
person Gord Thompson    schedule 16.01.2014
comment
ฉันจะลองเล่นกับสิ่งนี้สักหน่อยเพื่อดูว่าฉันจะทำงานได้หรือไม่ ในโซลูชันจริงของฉัน ฉันมีทั้งฐานข้อมูลหลายฐานข้อมูลและจำนวนตารางแบบไดนามิก ฉันหวังว่าจะไม่ต้องพึ่งพาวิซาร์ดเพราะเหตุนี้ แต่ถ้าฉันสามารถแก้ไขปัญหาได้อย่างถูกต้องสำหรับอินสแตนซ์เดียว หวังว่ามันจะง่ายกว่าที่จะขยาย - person Atl LED; 17.01.2014
comment
@AtlLED ฉันสามารถโพสต์ลิงก์ไปยังสำเนาของโปรเจ็กต์ C# ได้ หากคุณอาจพบว่ามีประโยชน์ เช่น เพื่อดูว่าตัวช่วยสร้างได้ทำอะไรในเบื้องหลัง - person Gord Thompson; 17.01.2014
comment
นั่นจะเป็นประโยชน์ขอบคุณ จริงๆ แล้วฉันได้โค้ดต้นฉบับเกือบใช้งานได้โดยการปิดและเปิด DGV.AllowUserToAddRows แต่ฉันไม่สามารถจับอักขระเริ่มต้นที่พิมพ์ลงในเซลล์แถวใหม่ได้เนื่องจากค่าอ่านเป็น DBNull มันเป็นเพียงตัวละครตัวแรกเท่านั้นดังนั้นฉันจึงพยายามที่จะคว้ามันไว้ตอนนี้ - person Atl LED; 17.01.2014
comment
@AtlLED ฉันได้อัปเดตคำตอบของฉันแล้ว คุณสามารถดาวน์โหลดสำเนาของโปรเจ็กต์ C# ที่ไม่ต้องใช้วิซาร์ดใหม่ได้ที่นี่ - person Gord Thompson; 17.01.2014
comment
ว้าวนั่นเป็นคำตอบที่ยอดเยี่ยม ให้เวลาฉันสักวันในการดำเนินการและนำไปใช้จริง แต่ฉันรู้สึกว่านี่จะเป็นคำตอบที่ยอมรับได้ ฉันเข้าใจว่าคุณจะเปิดการเชื่อมต่อตลอดเวลาที่เปิดแบบฟอร์มใช่ไหม - person Atl LED; 17.01.2014
comment
@AtlLED สำหรับการเชื่อมต่อกับฐานข้อมูล Access ฉันไม่เชื่อว่าการเปิดการเชื่อมต่อไว้จะสร้างความเจ็บปวดมากเกินไป (ไม่เหมือนกับสภาพแวดล้อมฐานข้อมูลไคลเอนต์/เซิร์ฟเวอร์ที่มีผู้ใช้หลายรายซึ่งการเชื่อมต่อที่ใช้งานอยู่เป็นสินค้าที่มีค่ามากกว่า) หากคุณมีผู้ใช้พร้อมกันหลายคน การเพิ่มคำสั่ง Close() และ Open() จะมีผลในการล้างการเปลี่ยนแปลงไปยังผู้ใช้รายอื่น (ซึ่งจะเกิดขึ้นโดยอัตโนมัติ แต่บางครั้งอาจใช้เวลาหลายวินาทีก่อนที่การเปลี่ยนแปลงในการเชื่อมต่อหนึ่งจะมองเห็นได้ในการเชื่อมต่ออื่น) - person Gord Thompson; 17.01.2014
comment
ขออภัยที่กลับมาที่สิ่งนี้ แต่คุณจะผูก DGV เฉพาะกับ bs.DataMember ได้อย่างไร ฉันลอง this.dataGridView1.DataSource = this.bindingSource1.Current() กับแนวคิดที่เพิ่งตั้งค่า datamember แต่นั่นไม่ได้ผล ฉันคิดว่านี่เป็นปัญหาสุดท้ายของฉันเกี่ยวกับเรื่องนี้ - person Atl LED; 22.01.2014
comment
@AtlLED ทั้งหมดที่ฉันทำคือ this.dataGridView1.DataSource = this.bindingSource1 - นั่นไม่ได้ผลสำหรับคุณเหรอ? - person Gord Thompson; 22.01.2014

นี่คือการดำเนินการ แก้ไข ของฉันในบางส่วนของธุรกรรมของคุณ

    daZZ.InsertCommand = cmdBldr.GetInsertCommand()

ฉันยังไม่คิดว่าจำเป็นต้องใช้ InsertCommand ฉันคิดว่านี่คือการสร้างหนึ่งใน 3 แถวของคุณ

    ds.Tables(DTName).Rows.Add(DaZZDataRow)

นี่คือการสร้างแถวที่สองของคุณ ซึ่งถูกต้อง แต่ก็ไม่จำเป็นเช่นกัน

แถวที่สามกำลังถูกสร้างขึ้นโดย DataGridView เนื่องจาก DataBinding เมื่อคุณผูกตารางกับ DataGridView และ DGV ได้รับอนุญาตให้ "AddRows" ก็จะสร้างแถวที่แทรกเช่นกัน

ลองลบ 2 รายการนี้ทั้งหมด รวมถึง Clear line (ฉันไม่คิดว่าจำเป็น) และฉันพนันได้เลยว่าคุณจะได้รับการเพิ่มหนึ่งแถวซึ่งเป็นแถวที่กำลังเพิ่มใน DGV

คุณจะยังคงต้องโทร UPDATE และ FILL เพื่อซิงค์ข้อมูลในตารางอีกครั้ง

person DarrenMB    schedule 16.01.2014
comment
จริงๆ แล้วฉันคิดว่าฉันต้องการสิ่งนั้นเพื่อเขียนกลับไปยังฐานข้อมูล ถ้าฉันเพิ่งอัปเดตตารางข้อมูล มันจะไม่สร้าง ID จากฐานข้อมูล ฉันเคลียร์มันแล้วเติมด้วยคีย์หลักจากฐานข้อมูลเพื่อไม่ให้เกิดปัญหาการทำงานพร้อมกัน อย่างไรก็ตาม แม้ว่าเราจะเพิกเฉยต่อ DB ทั้งหมดและแสดงความคิดเห็นในส่วนเหล่านี้ บรรทัด `ds.tables(DTname).Rows.Add() จะสร้าง 3 แถวใน DGV (โดยตัวมันเอง) ฉันคิดว่านั่นคือปัญหาที่แท้จริง - person Atl LED; 16.01.2014
comment
คำตอบที่แก้ไขแล้ว ฉันคิดว่านี่เป็นปัญหาของคุณตอนนี้ - person DarrenMB; 16.01.2014
comment
ผมว่าไม่นะครับ ผมจะลงโค้ดที่แก้ไขตามที่ผมเข้าใจในคำถามหลังไปสัมมนาครับ จากตัวอย่าง การใส่ความคิดเห็นในบรรทัด 86-88, 94, 98 และ 102 รวมถึงการไม่อนุญาตให้เพิ่มแถว DGV ทำให้เราลงไปถึง 2 แถวที่ถูกสร้างขึ้น แต่ยังรวมถึงตารางที่จะเพิ่มเป็นสองเท่าและไม่ได้ดึง ID ซึ่งทำให้เกิดข้อผิดพลาดในการทำงานพร้อมกัน . ฉันจะเล่นกับแนวคิดนี้อีกและอัปเดต - person Atl LED; 16.01.2014
comment
จริงๆ แล้ว ฉันคิดว่าการปิด DGV เพื่อเพิ่มแถวในขณะที่ปล่อยสิ่งอื่นๆ ไว้อาจเป็นวิธีแก้ปัญหา - person Atl LED; 16.01.2014
comment
หวังว่ามันจะช่วยคุณได้ ปกติแล้วฉันจะหลีกเลี่ยงการผูกข้อมูลเหมือนกับโรคระบาด เพราะมันเป็นกล่องดำขนาดใหญ่ที่จัดการได้ยาก - person DarrenMB; 17.01.2014
comment
ฉันอยากจะบอกว่าถ้าฉันมีตัวแทนเหลืออยู่ ฉันจะพยายามให้เงินรางวัลแก่คุณด้วย ที่จริงแล้วทั้ง 3 แถวเกิดจากการที่ DGV สามารถสร้างแถวใหม่ได้ การปิดสิ่งนั้นในสคริปต์ต้นฉบับทำให้มันใช้งานได้ แม้ว่าคุณจะสูญเสียอักขระตัวแรกที่พิมพ์ในแถว (ซึ่งฉันไม่สามารถจับภาพได้) ที่กล่าวว่าส่วนที่เหลือของสคริปต์ดูเหมือนจะจำเป็นเพื่อให้ทำงานได้อย่างถูกต้อง - person Atl LED; 21.01.2014
comment
ดีใจที่คุณแก้ไขมันได้ ไม่ต้องกังวลเกี่ยวกับมัน จำนวนไม่สำคัญ ฉันคิดว่าพวกเราทุกคนใช้ไซต์นี้เพื่อสิ่งเดียวกัน ซึ่งเป็นอีกที่หนึ่งในการสะท้อนความคิดเมื่อติดอยู่กับบางสิ่งบางอย่าง - person DarrenMB; 21.01.2014