2011-06-07 43 views
1

我有一個datagridview,需要某些列來顯示自定義tooltiptext。我試圖通過CellToolTipTextNeeded事件按需加載tooltiptext,而不是將它們全部存儲在前面,但它給我一些問題。起初,我將它們全部分配在初始數據綁定中,並且它們按照我的預期顯示。如何使用DataGridview中的CellToolTipTextNeeded事件覆蓋默認的tooltiptext(單元格太小而不能顯示值)?

既然我已經通過事件加載了工具提示,我必須將鼠標懸停在單元格上兩次以查看我的自定義工具提示。首先,要查看.Net顯示單元格內容是否太大的默認工具提示文本,則必須將鼠標移到另一個單元格上,然後返回以查看我的自定義工具提示。

我試着將每個單元格的工具提示文字設置爲空白,但沒有奏效,正如我想的那樣。有任何想法嗎?

這裏就是我實現代碼:

private void PopulateTabs() 
    { 
     tabs.Visible = true; 
     tabs.TabPages.Clear(); 
     results_ = some Dataset 

     foreach (DataTable dt in results_.Tables) 
     { 
      if (dt.Rows.Count == 0) 
       continue; 
      tab = new TabPage(dt.TableName); 
      DataGridView dgv = new DataGridView(); 
      dgv.DataSource = dt.DefaultView; 
      dgv.Name = dt.TableName; 
      dgv.Dock = DockStyle.Fill; 
      dgv.SelectionChanged += new EventHandler(dgv_SelectionChanged); 
      dgv.RowHeadersVisible = false; 

      if (dt.TableName == Recon.ControlEvalResultsTablename || dt.TableName == Recon.TestEvalResultsTablename) 
       dgv.RowPostPaint += new DataGridViewRowPostPaintEventHandler(dgv_RowPostPaint); 
      else 
      { 
       dgv.CellToolTipTextNeeded += new DataGridViewCellToolTipTextNeededEventHandler(dgv_CellToolTipTextNeeded); 
       dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(dgv_CellFormatting); 
      } 
      tab.Controls.Add(dgv); 
      tabs.TabPages.Add(tab); 
     } 
    } 

回答

0

確保您使用的CellToolTipTextNeeded事件的ToolTipText屬性來設置你的細胞的工具提示文本。當控件顯示大小不能完全顯示其值的單元格的工具提示時,此設置將覆蓋顯示的默認文本。

試試我所看到的。使用適用於所有DGV單元的數據加載DGV。驗證沒有單元格工具提示正在顯示。調整列的大小,以便不顯示某些單元格的文本,並驗證該單元格的值是否出現在單元格的工具提示中。現在將以下代碼添加到DGV的CellToolTipTextNeeded事件中:

e.ToolTipText = string.Format("Hello, I'm on row '{0}', column '{1}'", e.RowIndex, e.ColumnIndex); 

重複上述測試。您會注意到顯示了自定義工具提示文本,並且不顯示用於顯示已調整大小的單元格文本的默認工具提示。還請記住CellToolTipTextNeeded事件的RowIndex和ColumnIndex屬性(如上所示);請注意CellToolTipTextNeeded事件的RowIndex和ColumnIndex屬性(如上所示);請注意CellToolTipTextNeeded事件的RowIndex和ColumnIndex屬性。您可能會發現這些方法可以方便地檢索要用於工具提示文本的文本,或者確定是否要顯示工具提示。

UPDATE
我開發了一個基於您發佈的代碼的示例。放一個按鈕和一個TabControl(命名爲tabs)在一個乾淨的Winform(3.5),並使用下面的代碼形式:

using System; 
using System.Data; 
using System.Windows.Forms; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) { 
      PopulateTabs(); 
     } 

     private DataSet GetDataSet() { 
      DataSet ds = new DataSet(); 
      var dt1 = new DataTable("dt 1"); 
      dt1.Columns.Add("dt1 Field1"); 
      dt1.Columns.Add("dt1 Field2"); 
      dt1.Rows.Add(new object[] { "dt1f1r1", "dt1f2r1" }); 
      dt1.Rows.Add(new object[] { "dt1f1r2", "dt1f2r2" }); 
      dt1.Rows.Add(new object[] { "dt1f1r3", "dt1f2r3" }); 

      var dt2 = new DataTable("dt 2"); 
      dt2.Columns.Add("dt2 Field1"); 
      dt2.Columns.Add("dt2 Field2"); 
      dt2.Columns.Add("dt2 Field3"); 
      dt2.Rows.Add(new object[] { "dt2f1r1", "dt2f2r1", "dt2f3r1" }); 
      dt2.Rows.Add(new object[] { "dt2f1r2", "dt2f2r2", "dt2f3r2" }); 

      ds.Tables.Add(dt1); 
      ds.Tables.Add(dt2); 

      return ds; 
     } 

     private void PopulateTabs() { 
      tabs.Visible = true; 
      tabs.TabPages.Clear(); 
      DataSet results_ = GetDataSet(); 

      foreach (DataTable dt in results_.Tables) { 
       if (dt.Rows.Count == 0) 
        continue; 
       TabPage tab = new TabPage(dt.TableName); 
       DataGridView dgv = new DataGridView(); 
       dgv.DataSource = dt.DefaultView; 
       dgv.Name = dt.TableName; 
       dgv.Dock = DockStyle.Fill; 
       dgv.SelectionChanged += new EventHandler(dgv_SelectionChanged); 
       dgv.RowHeadersVisible = false; 
//    if (dt.TableName == Recon.ControlEvalResultsTablename || dt.TableName == Recon.TestEvalResultsTablename) 
//     dgv.RowPostPaint += new DataGridViewRowPostPaintEventHandler(dgv_RowPostPaint); 
//    else 
//    { 
        dgv.CellToolTipTextNeeded += new DataGridViewCellToolTipTextNeededEventHandler(dgv_CellToolTipTextNeeded); 
        dgv.CellFormatting += new DataGridViewCellFormattingEventHandler(dgv_CellFormatting); 
//    } 
       tab.Controls.Add(dgv); 
       tabs.TabPages.Add(tab); 
      } 
     } 

     void dgv_SelectionChanged(object sender, EventArgs e) { 
      //throw new NotImplementedException(); 
     } 
     void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { 
      //throw new NotImplementedException(); 
     } 
     void dgv_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e) { 
      e.ToolTipText = string.Format("Hello, I'm on row '{0}', column '{1}'", e.RowIndex, e.ColumnIndex); 
     } 
    } 
} 

上述工作對我來說 - 只出現我明確設置工具提示文本。如果上面的演示適用於您,請嘗試禁用真實代碼的各個部分,直到您完全掌握所有代碼,然後開始重新排列,直到出現問題。

+0

我絕對設置ToolTipText屬性,我仍然需要兩次鼠標懸停。值得說的是,網格正在創建和編程添加?我在 – 2011-06-08 19:21:07

+0

之上添加了一些代碼@claxxical使用您的代碼更新了我的答案。讓我知道你發現了什麼... – 2011-06-09 00:19:58