2009-10-26 32 views
6

Tôi gặp phải sự cố khá khó chịu với điều khiển DataGridView (Windows.Forms, .NET Framework 3.0) khi có DataGridViewCell lớn hơn chính DataGridView . Khi ô lớn được cuộn vào chế độ xem, ô hiển thị bình thường, bị cắt ở phía dưới vì nó lớn hơn chế độ xem. Nếu bạn di chuyển xuống sâu hơn, cuối cùng nó sẽ "snaps" ở trên cùng và vẫn ở đó, cho đến khi bạn đạt đến một ngưỡng nhất định. Sau đó, hàng tiếp theo sẽ được hiển thị ở trên cùng và hàng "lớn" biến mất.C# DataGridView, các ô lớn: Nội dung không bao giờ hiển thị đầy đủ, di chuyển bỏ qua ô

Vì lý do đó bạn không bao giờ có thể xem đầy đủ nội dung của ô lớn.

Dưới đây là một ví dụ mã:

using System; 
using System.Windows; 

namespace LoggerTextBox { 
public class TestForm : Form 
{ 
    public TestForm() 
    { 
     Text = "DataGridView Large Cell Example"; 
     SetBounds(0, 0, 300, 200, BoundsSpecified.Width | BoundsSpecified.Height); 

     DataGridView dataGridView = new DataGridView(); 
     dataGridView.Dock = DockStyle.Fill; 
     dataGridView.ScrollBars = ScrollBars.Both; 
     dataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders; 
     Controls.Add(dataGridView); 

     DataGridViewColumn column = new DataGridViewTextBoxColumn(); 
     column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; 
     column.CellTemplate.Style.WrapMode = DataGridViewTriState.True; 
     dataGridView.Columns.Add(column); 

     // normal row 
     DataGridViewRow row = new DataGridViewRow(); 
     DataGridViewCell cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = "Foo"; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 

     // multiline row 
     row = new DataGridViewRow(); 
     cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = 
      "Lorem ipsum dolor sit amet, consetetur sadipscing elitr," + Environment.NewLine + 
      "sed diam nonumy eirmod tempor invidunt ut labore et doloreLorem," + Environment.NewLine + 
      "ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy," + Environment.NewLine + 
      "eirmod tempor invidunt ut labore et dolore magna aliquyam erat,," + Environment.NewLine + 
      "sed diam voluptua. At vero eos et accusam et justo duo dolores et," + Environment.NewLine + 
      "ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est," + Environment.NewLine + 
      "Lorem ipsum dolor sit amet. magna aliquyam erat, sed diam voluptua.," + Environment.NewLine + 
      "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita," + Environment.NewLine + 
      "kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 

     // normal row 
     row = new DataGridViewRow(); 
     cell = (DataGridViewTextBoxCell)column.CellTemplate.Clone(); 
     cell.Value = "Bar"; 
     row.Cells.Add(cell); 
     dataGridView.Rows.AddRange(row); 
    } 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new TestForm()); 
    } 
} 
} // namespace 

Bất kỳ ý tưởng làm thế nào để sửa lỗi này?

Trả lời

1

Tôi sẽ cắt bớt bất kỳ nội dung nào của ô vượt quá kích thước nhất định (với dấu ba chấm để cho biết cắt bớt) và cho phép ô được nhấp để hiển thị cửa sổ bật lên với nội dung đầy đủ hiển thị trong cửa sổ cuộn được. Hoặc tôi sẽ hiển thị nội dung của các ô có khả năng lớn này trong UserControl tùy chỉnh mà chính nó chứa các thanh cuộn nếu văn bản vượt quá một độ dài nhất định.

Bạn đang gặp phải sự cố kết quả từ DataGridView đang được sử dụng theo cách không mong muốn, vì vậy tôi không ngạc nhiên khi không có cách nào đơn giản, được tích hợp để giải quyết vấn đề này.

Cập nhật: để xem nhật ký, ReportViewer có thể là điều khiển phù hợp hơn. Dưới đây là một số liên kết về việc sử dụng nó:

http://www.codeproject.com/KB/cs/reportdisplay.aspx

http://www.microsoft.com/Downloads/details.aspx?FamilyID=f38f7037-b0d1-47a3-8063-66af555d13d9&displaylang=en

http://www.devx.com/dotnet/Article/30424/

+0

tôi cần một cái gì đó phức tạp hơn một mục đích textbox khai thác gỗ (để hiển thị các dữ liệu ghi nhận, để được chính xác) và tìm các DataGridView (ràng buộc với một danh sách các mục log) sẽ là một ý tưởng tốt. Tôi bỏ qua vấn đề di chuyển này ngay bây giờ bằng cách tách các tin nhắn thành nhiều hàng trước. Không chính xác những gì tôi muốn vì nó giới thiệu các vấn đề khác, nhưng ... được rồi. Cảm ơn! – sunside

+0

@Markus: bạn có đăng nhập bằng tiếng Latin không? :) – MusiGenesis

+0

@Markus: Tôi khuyên bạn nên đặt câu hỏi của mình như một câu hỏi khác ở đây trên SO và xem những gì mọi người đề xuất. Một cái gì đó như "kiểm soát tốt nhất để hiển thị (có khả năng rất dài) các mục đăng nhập trong một ứng dụng winforms là gì?" Tôi thực sự không thể nghĩ ra một câu trả lời hay, bản thân mình. Tôi có lẽ sẽ kết thúc bằng văn bản một điều khiển tùy chỉnh hoàn chỉnh cho điều này, nhưng đó là tiềm năng rất nhiều công việc. – MusiGenesis

Các vấn đề liên quan