Как переопределить текст всплывающей подсказки по умолчанию (ячейка слишком мала для отображения значения) с помощью события CellToolTipTextNeeded в представлении сетки данных?

У меня есть datagridview, для которого требуются определенные столбцы для отображения пользовательского всплывающего текста. Я пытаюсь загрузить всплывающую подсказку по запросу с помощью события CellToolTipTextNeeded, а не хранить их все заранее, но это вызывает у меня некоторые проблемы. Сначала я назначил их все при первоначальной привязке данных, и они появились, как я и ожидал.

Теперь, когда всплывающие подсказки загружаются через событие, мне нужно дважды навести указатель мыши на ячейку, чтобы увидеть свою пользовательскую всплывающую подсказку. Во-первых, чтобы увидеть текст всплывающей подсказки по умолчанию, который .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);
        }
    }

person Josh Kim    schedule 07.06.2011    source источник


Ответы (1)


Убедитесь, что вы используете событие CellToolTipTextNeeded ToolTipText, чтобы установить текст всплывающей подсказки для ваших ячеек. Этот параметр переопределяет текст по умолчанию, отображаемый, когда элемент управления показывает всплывающие подсказки для ячеек, размеры которых не позволяют полностью отобразить их значение.

Попробуйте то, что я сделал, чтобы увидеть это. Загрузите в DGV данные, соответствующие всем ячейкам DGV. Убедитесь, что подсказки ячеек не отображаются. Измените размер столбца, чтобы часть текста ячейки не отображалась, и убедитесь, что значение этой ячейки отображается во всплывающей подсказке ячейки. Теперь добавьте следующий код в событие CellToolTipTextNeeded DGV:

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

Повторите тесты выше. Вы заметите, что текст пользовательской подсказки отображается, а подсказка по умолчанию, которая отображает текст ячейки с измененным размером, не отображается.

Также имейте в виду свойства RowIndex и ColumnIndex события CellToolTipTextNeeded (показаны выше); они могут оказаться удобными для извлечения текста, который вам нужен для текста всплывающей подсказки, или для определения, хотите ли вы вообще отображать всплывающую подсказку.

ОБНОВЛЕНИЕ
Я разработал пример на основе кода, который вы опубликовали. Поместите Button и 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);
        }
    }
}

Вышеупомянутое работает для меня - появляется только мой явно заданный текст подсказки. Если приведенная выше демонстрация работает для вас, попробуйте отключить разделы вашего реального кода, пока вы не дойдете до того, что есть у меня, а затем начните повторное подключение, пока не увидите проблему.

person Jay Riggs    schedule 07.06.2011
comment
Я определенно устанавливаю свойство ToolTipText, и мне все еще приходится дважды наводить указатель мыши. Стоит ли говорить, что сетки создаются и добавляются программно? Я добавил код выше - person Josh Kim; 08.06.2011