2011-12-26 35 views
14

Tôi đã gặp lỗi (tôi giả định) trong .NET 3.5. Khi thêm hàng vào một DataGridView sử dụng Rows.Add(), trong khi DGV bị tắt, thanh cuộn dọc không cập nhật đúng. Do đó bạn không thể cuộn tất cả các con đường xuống dưới cùng của DGV bằng cách sử dụng thanh cuộn hoặc bánh xe chuột sau khi bật lại DGV (điều hướng bằng các phím mũi tên vẫn hoạt động.)Thanh cuộn dọc DataGridView không cập nhật đúng (Lỗi biểu mẫu?)

Vì vậy, tôi đang tìm một cách giải quyết khác. Có cách nào để buộc thanh cuộn để cập nhật giới hạn của nó hoặc bạn có thể nhập thủ công một giá trị tối đa mới không? Tôi không muốn phải repopulate DGV.

*) Trên thực tế, đó là biểu mẫu gốc bị vô hiệu hóa, nhưng tôi cho rằng vấn đề là nó tuyên truyền cho điều khiển DGV.

Trả lời

13

Tôi vừa gặp sự cố này (biểu mẫu của tôi đã bị tắt trong khi thêm hàng) và giải quyết bằng cách đặt thuộc tính cuộn của lưới thành 'Không' trước khi thêm hàng rồi đặt lại thành 'Cả hai' một lần hàng đã được thêm.

+0

Vẫn là một kludge, nhưng tốt hơn một chút. Cảm ơn. :) – ReturningTarzan

+0

Siêu! Lưu tôi))) – Konstantin

+1

Điều này hoạt động rất tốt, nhưng chỉ cần gọi 'PerformLayout()' sau khi 'SetDataSource' hoạt động quá! –

0

Thực ra, tôi chỉ tìm thấy một cách giải quyết khác nhưng tôi không thích nó. Sau khi bật lại DGV, bạn có thể thực hiện việc này:

int x = Rows.Add(); 
Rows.RemoveAt(x); 

Và sau đó thanh cuộn được cập nhật. Nhưng nó không phải là rất đẹp, nó gây ra một nhấp nháy nhỏ gây phiền nhiễu, và nó có thể cháy một số sự kiện mà tôi đã phải cố ý bỏ qua. Tôi sẽ để câu hỏi mở một chút với hy vọng có một giải pháp tốt hơn.

18

này cũng giải quyết được vấn đề đối với tôi:

DataGridView.SuspendLayout(); 
DataGridView.ResumeLayout(); 

Nó có thể được gọi trước khi DGV được tái kích hoạt.


UPDATE: này cũng không được công việc:

DataGridView.PerformLayout(); 
+0

Tôi gặp sự cố với thanh cuộn bị tắt với autosizemode.fill, thực hiện việc thực hiện sau khi thay đổi nội dung cũng làm việc cho tôi. Cảm ơn! bạn đã cứu ngày của tôi! – MazarD

+0

Cảm ơn bạn !!! Hoạt động của nó – Raj

+2

Đây phải là câu trả lời được chấp nhận. Giúp tôi quá. Cảm ơn bạn! –

0

Nó được quan sát thấy rằng, khi chiều rộng và chiều cao của DataGridView1 được so sánh với chiều rộng và chiều cao của hình thức, và chiều rộng và chiều cao được đặt lại nếu chúng vượt quá kích thước của biểu mẫu, thanh cuộn trở nên hiển thị.

Hãy thử đoạn mã sau, sẽ tự động thêm một điều khiển DataGridView vào một mẫu và tạo ra một lưới vuông với tên hàng và tiêu đề cột:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     'Following code adds a Datagridview control to a Form dynamically 
     'Step 1. Add a textbox to a Form, and input the number of columns (ncol). (Note: in this example, ncol=nrow). 
     'Step 2. Set the Form's Windowstate property to Maximized 
     For Each cont As Control In Me.Controls 'remove DataGridView if it already exists on the Form 
      If TypeOf (cont) Is DataGridView Then 
       Me.Controls.Remove(cont) 
      End If 
     Next 
     Dim DataGridView1 As New DataGridView 'create new data grid view dynamically during run-time 
     Me.Controls.Add(DataGridView1) 'add the data grid view to the Form 
     Me.Refresh() 
     Dim i, nrow, ncol As Integer ' ncol=nrow -->this is a square grid 
     ncol = TextBox1.Text 
     nrow = ncol 'Note: add a second textbox to the form and input nrow if you don't want a square grid 
     DataGridView1.Visible = True 
     DataGridView1.Top = 100 
     DataGridView1.Left = 100 
     DataGridView1.Rows.Clear() 
     Do While DataGridView1.Columns.Count > 0 
      DataGridView1.Columns.RemoveAt(DataGridView1.Columns.Count - 1) 
     Loop 
     For i = 1 To ncol 
      DataGridView1.Columns.Add(i, "V" & i) 
     Next 
     DataGridView1.Width = ncol * 115 
     DataGridView1.Height = nrow * 22 + 45 
     If DataGridView1.Width > Me.Width - DataGridView1.Left Then DataGridView1.Width = Me.Width - DataGridView1.Left - 20 
     If DataGridView1.Height > Me.Height - DataGridView1.Top Then DataGridView1.Height = Me.Height - DataGridView1.Top - 50 
     DataGridView1.ScrollBars = ScrollBars.None 
     For i = 1 To nrow 
      DataGridView1.Rows.Add() 
      DataGridView1.Rows.Item(i - 1).HeaderCell.Value = "V" & i 
     Next 
     DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) 
     Dim dgvColumnHeaderStyle As New DataGridViewCellStyle() 
     dgvColumnHeaderStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 
     DataGridView1.ColumnHeadersDefaultCellStyle = dgvColumnHeaderStyle 
     DataGridView1.AllowUserToAddRows = False 
     DataGridView1.ScrollBars = ScrollBars.Both 
     Me.WindowState = FormWindowState.Maximized 
    End Sub 
0

Tôi muốn thêm một bình luận cho các bài bản gốc, nhưng tôi chưa thể (dưới 50 danh tiếng).

Tôi đã gặp sự cố tương tự khi xóa hàng. Thanh cuộn trông giống như bị tắt, không có thanh trượt nào hiển thị và các mũi tên có màu xám.
Sẽ thử các giải pháp được mô tả ở đây và at this link (explicitly enable the scrollbars again) hoặc chỉ cần giữ toàn bộ DGV được bật.
Ngoài ra, this link suggests the same workaround (explicitly enabling...) và gọi nó hoạt động.

0

Sự cố của tôi bắt nguồn từ việc gọi dgv.Add() trong chuỗi người dùng. Sau khi thay đổi nó để được gọi từ thread UI thay vào đó, các thanh cuộn hiển thị và hoạt động bình thường:

 if (dataGridView1.InvokeRequired) 
     { 
      dataGridView1.Invoke((Action)(() => dataGridView1.Rows.Add(new String[] { abc, efg }))); 
     } 
     else 
     { 
      dataGridView1.Rows.Add(new String[] { calPoint, logUrl }); 
     } 
1

Nếu không có giải pháp cho khác làm việc cho bạn, tôi tình cờ gặp một vấn đề tương tự với thanh cuộn dọc trong DataGridView.Nhưng vấn đề là giống như bất cứ khi nào số lượng hàng mở rộng vượt ra ngoài chiều cao của datagridview, cuộn dọc tạo ra một giao diện người dùng rối tung lên. Loại hàng chồng lên nhau.

Tôi đã có DataGridView dữ liệu.

Đây là danh sách những điều tôi đã thử nhưng không hoạt động.

  1. Đặt thuộc tính ScrollBars thành Không, sửa đổi nguồn dữ liệu và sau đó đặt thuộc tính ScrollBars thành Cả hai.
  2. Sử dụng SuspendLayout, ResumeLayout và PerformLayout tại các kết hợp khác nhau.
  3. Đặt bộ đệm đôi cho DataGridView bằng cách sử dụng phương pháp mở rộng.

Cuối cùng, Thiết AutoSizeRowsMode để DataGridViewAutoSizeRowsMode.AllCells cố định vấn đề đối với tôi.

Nếu bạn gặp sự cố tương tự với cuộn ngang, tôi cho rằng hãy chơi với AutoSizeColumnsMode nên khắc phục sự cố.

0

Khi thanh trượt được không kích thước một cách chính xác và chiếm hầu hết các thanh cuộn dọc giải pháp của tôi là -

DGV.height = DGV.Height + 1

DGV.Height = DGV.Height - 1

Sau đó các thanh trượt được kích thước

đúng Nhưng bây giờ tôi sử dụng

DGV.PerformLayout

cũng giải quyết được sự cố

-2

Hai hàng cuối cùng của DataGridView của tôi luôn được ẩn trên WinForms của tôi. Tôi có thể cuộn đến chúng bằng cách sử dụng phím mũi tên xuống (nhưng vẫn không thấy hàng nào tôi thực sự đang bật). Các bánh xe chuột và thanh trượt xuống mũi tên sẽ không nhận được cho họ hoặc. Chỉ với một tập dữ liệu nhỏ và tối đa hóa biểu mẫu, tôi có thể thấy hai hàng cuối cùng.

Đây là cách tôi khắc phục sự cố: Tôi đã đặt DataGridView trong Bảng điều khiển. BAM!

Nó cũng cố định một vấn đề khác với DataGridView, rằng khi tôi thay đổi kích cỡ một tiêu đề cột đường dọc lạ sẽ xuất hiện trên bất kỳ điều khiển UI dưới DataGridView. Nó rất xấu xí và không chuyên nghiệp. Nhưng bây giờ nó cũng được sửa.

0

tôi thấy bài viết của bạn trong khi tìm kiếm một giải pháp cho vấn đề tôi gặp phải. Những gì tôi gặp phải trên Microsoft Surface của tôi (Win10) là không có khả năng cuộn dọc DataGridView vào dòng cuối cùng của một danh sách dài bằng một cử chỉ cảm ứng (như phim). Thông thường, dòng cuối cùng là maddeningly khó khăn để có được. Giải pháp rất đơn giản nhưng tôi mất một thời gian để tìm ra. Tôi để nó ở đây trong trường hợp nó hữu ích.

// Override WndProc in your custom class inherited from DataGridView 
protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
    case 0x115:// WM_VSCROLL 
     // The low-order word holds the command 
     uint cmd = ((uint)m.WParam & (uint)0x0000FFFF); 
     switch (cmd) 
     { 
     case 5: // SB_THUMBTRACK 
      if (Rows.Count > 0) 
      { 
      // The high-order word holds the position 
      uint pos = ((uint)m.WParam & (uint)0xFFFF0000) >> 16; 

      // SAVE: This would give us the "true" ratio based on 100% 
      // SAVE: double ratio = (double)pos/(double)(VerticalScrollBar.Maximum - VerticalScrollBar.LargeChange); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 

      // What we want is the ratio to the TOP of the thumb, BECAUSE 
      // THIS GIVES US THE RATIO TO THE FIRST LINE INDEX 
      double firstLineRatio = (double)pos/(double)(VerticalScrollBar.Maximum); 
      // We want to make it so that it shows the full line 
      // even if we just barely meet the ratio 
      double dFirstLine = firstLineRatio * Rows.Count; 
      int iFirstLine = (int)(dFirstLine + 0.9999); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 
      FirstDisplayedScrollingRowIndex = iFirstLine; 
      // We do this INSTEAD OF the default for this message, so RETURN 
      return; 
      } 
      break; 
     } 
     break; 
    default: 
     break; 
    } 
    base.WndProc(ref m); 
} 
1

Vấn đề của tôi là thanh cuộn dọc của tôi biến mất hoàn toàn. Tôi flailed với tất cả các đề xuất trên và cuối cùng phát hiện ra rằng làm cho bảng điều khiển có chứa DataGridView hẹp hơn so với hình thức giải quyết vấn đề. Trong trường hợp của tôi, 16 pixel hẹp hơn làm việc.

0

Giải pháp của tôi là tắt thanh cuộn từ thuộc tính của nó. Sau đó bật chúng từ dòng mã sau khi khởi tạo cửa sổ. DataGridViewObj.ScrollBars = ScrollBars.Both

0

Đối với tôi vấn đề là tôi đặt datagrid của mình trong một TabPage không được hiển thị trong thời gian tạo dữ liệu để việc đăng ký bị sai lệch.

Tôi tìm thấy một là để tạo ra một bản cập nhật chính xác chỉ bằng cách tự động Diable/kích hoạt tại mỗi sự thay đổi có thể nhìn thấy :

public MyForm() 
{ 
    InitializeComponent(); 

    // Automatic scroll to bottom (it might not work if you try to do it without this event) 
    datagrid.RowsAdded += (sender, e) => 
    { 
     datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1; 
    }; 

    // WinForms bug fix: scrollbar update 
    datagrid.VisibleChanged += (sender, e) => 
    { 
     Enabled = false; 
     Enabled = true; 
    }; 
} 
Các vấn đề liên quan