Announcement

Collapse
No announcement yet.

Vấn đề cập nhật dữ liệu và xóa một dòng trong DataGridView

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C#] Vấn đề cập nhật dữ liệu và xóa một dòng trong DataGridView

    Nhờ mọi người giúp vấn đề sau đây:
    Chức năng thêm và xóa dữ liệu em đã viết xong. Ban đầu nếu xóa dòng cuối cùng thì không vấn đề gì bởi vì nó không ảnh hưởng đến các dòng đầu (đặt khóa chính là STT) 1.jpg
    Nhưng khi xóa những dòng đầu tiên, khóa chính không cập nhật trên cả SQL và datagridview
    VD: STT Tên
    1 A
    2 B
    3 C
    Sau khi chọn Xóa dòng đầu tiên hiển thị là:
    STT Tên
    2 B
    3 C
    Hoặc khi xóa hết cả 3 dòng, bắt đầu thêm lại dữ liệu thì dòng đầu tiên lại có STT là 4
    Còn đây là code chức năng thêm vào: http://pastebin.com/aXpV8d86
    Vậy làm cách nào sau khi xóa Tên A, thì Tên B được đẩy lên lại với STT là 1
    Nói chung mới đầu 1 2 3 4... thì xóa dòng cuối cùng không vấn đề gì, nhưng khi xóa những dòng phía trên thì làm cách nào để giải quyết?

  • #2
    Khóa chính là một thuộc tính mà các giá trị của nó không trùng lặp, khi tạo cơ sở dữ liệu nên đánh khóa chính theo index để truy xuất nhanh hơn. Tuy nhiên người dùng cuối không quan tâm đến khóa chính mà họ chỉ quan tâm đến những giá trị khác, khi đó khóa chính chỉ là thuộc tính trừa tượng trong quá trình lập trình mà thôi.
    Theo anh em không nên lấy khóa chính hiển thị ra màn hình mà nên tạo một cột stt riêng, bởi vì khi em thêm một dòng thì nó thêm cuối bảng nên không thấy lỗi xuất hiện. Khi xóa một hàng thì em phải cập nhật lại khóa chính của nó thì nó mới hiển thị lại như em muốn. Nếu chỉ có một bảng thì việc sửa khóa chính không có ảnh hưởng gì nhưng nếu có nhiều bảng thì em phải cập nhật lại toàn bộ thông tin của các bảng khác.
    Ngoài ra anh cũng góp ý việc cách em tạo một bảng trong csdl, tên bảng nên viết hoàn toàn bằng chữ in hoa, tên cột không nên để dấu em nhé.

    Comment


    • #3
      Em còn vấn đề muốn hỏi nữa: dữ liệu trên datagrv em dùng sự kiện thủ công là CellClick để mỗi lần click lên 1 dòng trên datagrv thì dữ liệu trên dòng đó sẽ hiện lên các textbox. Nhưng click để hiện thì lúc hiện lúc không là sao, phải lick rất nhiều lần nó mới hiện lên các textbox? Đây là code: http://pastebin.com/d330yvHc

      Thứ 2 đây là code xóa 1 dòng trên datagrv đồng thời cũng xóa luôn dòng trong SQL: http://pastebin.com/raw.php?i=evsemn02
      Trước khi bấm vào button Xóa thì bắt buộc phải click vào 1 dòng trên datagrv để dữ liệu của cột STT phải hiện lên TextBox21 thì sau đó mới xóa được. Nếu không hiện, khi bấm xúa thì xuất hiện cảnh báo "Input string was not in a correct format" ở dòng này: DataRow row = dt.Select("STT =" + Convert.ToInt32(textBox21.Text)) [0];
      Vậy có cách nào chỉ cần click 1 1 dòng, sau đó bấm xóa thì xóa được ngay luôn, không cần phải hiển thị dữ liệu lên textbox nào cả?

      Comment


      • #4
        vấn đề thứ nhất:
        a ít code bên winform nên k rõ vì sao nó lúc lên lúc lại không lên. còn code thì cái đó k liên quan đến việc hiện textbox đâu.hơn nữa e không chụp hình toàn bộ cái form nên a cũng không biết em cho nó hiện lên textbox nào @@. nếu là textbox trong gridview thì là e phải click 2 lần. lần đầu là chọn ô lần 2 là để hiện textbox để sửa dữ liệu, vậy nên click nhiều lần là đúng thôi.
        thứ 2:
        anh hok biết textbox21 là cái nào , khi e xóa một dòng thì e phải chọn dòng đó, có dữ liệu vào mới xóa được. ở đây e chọn stt thì bắt buộc e phải chọn ô stt nó mới có thể xóa được.
        em có thể dùng e.RowIndex và e.CollumIndex trong hàm cellclick để lấy dữ liệu và xóa

        Comment


        • #5
          Originally posted by 12520222 View Post
          Em còn vấn đề muốn hỏi nữa: dữ liệu trên datagrv em dùng sự kiện thủ công là CellClick để mỗi lần click lên 1 dòng trên datagrv thì dữ liệu trên dòng đó sẽ hiện lên các textbox. Nhưng click để hiện thì lúc hiện lúc không là sao, phải lick rất nhiều lần nó mới hiện lên các textbox? Đây là code: http://pastebin.com/d330yvHc

          Thứ 2 đây là code xóa 1 dòng trên datagrv đồng thời cũng xóa luôn dòng trong SQL: http://pastebin.com/raw.php?i=evsemn02
          Trước khi bấm vào button Xóa thì bắt buộc phải click vào 1 dòng trên datagrv để dữ liệu của cột STT phải hiện lên TextBox21 thì sau đó mới xóa được. Nếu không hiện, khi bấm xúa thì xuất hiện cảnh báo "Input string was not in a correct format" ở dòng này: DataRow row = dt.Select("STT =" + Convert.ToInt32(textBox21.Text)) [0];
          Vậy có cách nào chỉ cần click 1 1 dòng, sau đó bấm xóa thì xóa được ngay luôn, không cần phải hiển thị dữ liệu lên textbox nào cả?
          1. Em bắt sự kiện CellContentClick => nên em phải click đúng chính xác vô content (dữ liệu trên cell) của nó thì sự kiện mới đc thực thi, do đó việc em phải click vài lần là chuyện thường tình . Nên em chuyển qua CellClick nhá.
          2. Đuoc chứ em:
          Click 1 dòng trên datagridview. Em sẽ biết đc RowIndex hiện tại là bao nhiêu đúng không?
          => Em sẽ truy xuất đc DataGridViewRow bằng : datagridview.Rows[RowIndex] ==> Có DataGridViewRow thì em lấy đc STT ( nằm ở cell thứ 0 ):
          datagridview.Rows[RowIndex].Cells[0].Value ( nhớ convert cái này về int)
          Rồi có STT thì cứ thế mà xóa.

          Im a british accent lover

          Comment


          • #6
            Originally posted by 12520222 View Post
            Nhờ mọi người giúp vấn đề sau đây:
            Chức năng thêm và xóa dữ liệu em đã viết xong. Ban đầu nếu xóa dòng cuối cùng thì không vấn đề gì bởi vì nó không ảnh hưởng đến các dòng đầu (đặt khóa chính là STT) [ATTACH=CONFIG]11413[/ATTACH]
            Nhưng khi xóa những dòng đầu tiên, khóa chính không cập nhật trên cả SQL và datagridview
            VD: STT Tên
            1 A
            2 B
            3 C
            Sau khi chọn Xóa dòng đầu tiên hiển thị là:
            STT Tên
            2 B
            3 C
            Hoặc khi xóa hết cả 3 dòng, bắt đầu thêm lại dữ liệu thì dòng đầu tiên lại có STT là 4
            Còn đây là code chức năng thêm vào: http://pastebin.com/aXpV8d86
            Vậy làm cách nào sau khi xóa Tên A, thì Tên B được đẩy lên lại với STT là 1
            Nói chung mới đầu 1 2 3 4... thì xóa dòng cuối cùng không vấn đề gì, nhưng khi xóa những dòng phía trên thì làm cách nào để giải quyết?
            Em lấy thời gian làm khóa chính thay vì stt đi, mỗi lần xóa, sửa, thêm thì load lại grid: Xóa, sửa,... -> Update Database -> Load grid, vd nha:
            sql = "select * from " + TABLE + " WHERE ...."
            dsSft1 = CMgrDataBase.GetInstance().ReturnDataSet(sql) ' dsSft1 là DataSet, dòng này đơn giản là get dataset thôi, đừng quan tâm đến CMgrDataBase.GetInstance().ReturnDataSet(sql), cứ làm theo cách của e
            count11 = dsSft1.Tables(0).Rows.Count
            If count11 = 0 Then
            Exit Sub
            End If


            r = dsSft1.Tables(0).Rows(0) 'r là datarow nha
            grid(0, 0).Value = 1
            grid(0, 1).Value = r("name colum").ToString
            grid(0, 2).Value = r("name colum1").ToString

            Nếu muốn thêm hàng thì làm thêm vòng for.
            Sự kiện click vào grid thì dùng sự kiền Click hay MouseDown :
            Private Sub grid_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles grid.MouseDown
            If (grid.MouseCell.Column = 1) And grid.MouseCell.DisplayText.Length() > 0 Then
            tbx.text = grid(grid.MouseCellPosition.Row, 1).Value
            End If
            End Sub

            code này là vb.net, nhưng nó cũng giống c# thôi
            Last edited by 08520457; 15-01-2014, 17:24.

            Comment

            LHQC

            Collapse
            Working...
            X