2009-10-26 11 views
6

DataGridViewCellがDataGridViewより大きい場合、DataGridViewコントロール(Windows.Forms、.NET Framework 3.0)でかなり厄介な問題が発生しました。 。大型セルをスクロールして表示すると、通常は表示されますが、表示されているセルの大きさはビューよりも大きいため、下側が切り取られます。さらに下にスクロールすると、最終的に上部に「スナップ」して、一定のしきい値に達するまでそこにとどまります。次に、次の行が上部に表示され、「大きな」行が消えます。DataGridView、大きなセル:コンテンツが完全に表示されず、スクロールしているセルがスキップされる

このため、大きなセルの内容を完全に見ることはできません。この問題を解決する方法

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 

任意のアイデア:

は、ここで例のコードですか?

答えて

1

セルの内容を特定のサイズ(切り捨てを示す省略記号)を超えて切り捨てて、スクロール可能なウィンドウにコンテンツ全体が表示されたポップアップウィンドウを表示するようにセルをクリックできるようにします。または、テキストが特定の長さを超えている場合は、スクロールバーが含まれているカスタムのUserControlでこれらの潜在的に大きなセルの内容をレンダリングします。

DataGridViewが意図しない方法で使用されているという問題が発生しているので、これを処理する簡単な組み込みの方法がないことに驚くことはありません。

更新:ログを表示するためには、ReportViewerがより適切なコントロールである可能性があります。ここではそれを使用する方法についていくつかのリンクがあります:

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

私はテキストボックスのログ記録の目的よりも、より洗練されたものが必要(正確には、ログ出力を表示する)と考え出しDataGridView(ログ項目のリストにバインド)は良い考えです。私は今このスクロールの問題を回避し、いくつかの行にあらかじめメッセージを分割しています。それが他の問題を紹介するので、私が欲しいものではありません。でも、大丈夫です。 ありがとう! – sunside

+0

@Markus:あなたはすべてあなたのラテン語のログインをしますか? :) – MusiGenesis

+0

@Markus:あなたの問題をここで別の質問として尋ねることをお勧めします。何か "(非常に長い)潜在的に非常に長いログアイテムをwinformsアプリケーションに表示するための最良のコントロールは何ですか?"私は本当に良い答え、自分自身を考えることができません。私はおそらくこのための完全なカスタムコントロールを書くことになるだろうが、それは潜在的に多くの仕事です。 – MusiGenesis

関連する問題