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

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

1 Ответ

0 голосов
/ 08 июня 2011

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

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

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

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

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

UPDATE
Я разработал пример на основе кода, который вы разместили. Перетащите 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);
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...