Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Несколько ссылок в одной ячейке DataGridView


Автор: NikotiN 28.10.2008, 07:47
Доброе утро.
вот понадобилось, чтобы в одной ячейке было несколько ссылок через запятую. Такое вроде бы нельзя сделать в стандартном DataGridViewLinkCell, но можно через LinkLabel. Вот я и решил написать новый компонент, который бы выводил эту LinkLabel.
Собственно всё получилось, в Paint я выставляю ей размеры и положение и т.п... но вот когда идёт скроллинг, то получаются артефакты всякие - так как для невидимых ячеек не вызывается метод Paint, то все их LinkLabel остаются на экране.
Собственно вопрос: как сделать так, чтобы выводились LinkLabel только видимых ячеек, где это отслеживать?
Ну и ещё парочка:
каков общий принцип вывода контролов в ячейках таблицы? меня интересует именно вывод во всех ячейках, а не только при редактировании. Первое нигде не нашёл, а про второе почти везде пример с календарём, но мне это не нужно(
Может есть другой способ сделать несколько ссылок в одной ячейке? мне только необходимо отслеживать на какое слово нажали и всё

Автор: Partizan 28.10.2008, 09:07
NikotiN, уж  лучше не возиться с отрисовкой, а просто сделать новые DataGridViewCell и DataGridViewColumn

Автор: NikotiN 28.10.2008, 10:14
я так и делаю. прошу прощения не уточнил метод Paint у DataGridViewCell

Код

public class DataGridViewControlCellEx : DataGridViewCell
    {
        public DataGridViewControlCellEx()
            : base()
        {
            this.Style.Format = "";
            this.Style.NullValue = null;            
        }        
        protected override void Paint(System.Drawing.Graphics graphics,
            System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds,
            int rowIndex, DataGridViewElementStates cellState, object value,
            object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
            DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            graphics.FillRectangle(Brushes.White, cellBounds);
            //бля, так клик работает!!!!!!!!!!!!!!
            //RaiseCellContentClick(new DataGridViewCellEventArgs(0, 0));
            if (value != null)
            {
                //полдучаем контрол
                var ctrl = value as Control;
                //ctrl.Visible = false;
                var cell = this.DataGridView[ColumnIndex, rowIndex];                

                //выставляем координаты
                ctrl.Location = cellBounds.Location;
                ctrl.Width = cellBounds.Width;
                //определяем высоту контрола
                ctrl.Height = (Int32)(graphics.MeasureString(ctrl.Text, ctrl.Font, ctrl.Width).Height);
                ctrl.BackColor = Color.White;
                //определяем необходимую высоту ячейки
                var requiredHeight = ctrl.Height + ctrl.Margin.Top + ctrl.Margin.Bottom + 10;
                //выставляем
                this.DataGridView.Rows[rowIndex].Height = requiredHeight;
                cellBounds = new Rectangle(cellBounds.X, cellBounds.Y, cellBounds.Width, requiredHeight);
                //добавляем контрол в коллекцию
                if (!this.DataGridView.Controls.Contains(ctrl))
                    this.DataGridView.Controls.Add(ctrl);
            }
            //выводим элементы интерфейса
            this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
                formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);            
        }

        public override Type ValueType
        {
            get
            {
                return typeof(String);
            }
        }
    }

Автор: Partizan 28.10.2008, 10:30
NikotiN, а зачем все эти танцы с отрисовкой тогда?

Автор: NikotiN 28.10.2008, 10:32
а как мне выводить эти LinkLabel несчастные?
получается вот так: внизу то, что надо исправить - не скрываются LinkLabel от невидимых ячеек
http://ipicture.ru/Gallery/Viewfull/8501932.html
в общем вот минимизированный пример, как сделать так, чтобы скрывались LinkLabel для тех ячеек, который в настоящий момент на экран не выведены?

Код

public class DataGridViewLinkCellEx: DataGridViewCell
    {
        LinkLabelEx label;
        public DataGridViewLinkCellEx()
        {
            label = new LinkLabelEx();
        }

        public override Type ValueType
        {
            get
            {
                return typeof(String);
            }
        }

        protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            graphics.FillRectangle(Brushes.White, cellBounds);
            label.Location = cellBounds.Location;
            label.Size = cellBounds.Size;
            label.Text = value as String;
            label.BackColor = cellStyle.BackColor;
            label.LinkClicked += new LinkLabelLinkClickedEventHandler(label_LinkClicked);
            if (!this.DataGridView.Controls.Contains(label))
                this.DataGridView.Controls.Add(label);
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
        }

        void label_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            RaiseCellContentClick(new DataGridViewCellEventArgs(ColumnIndex, RowIndex));
        }
    }

Автор: Partizan 28.10.2008, 10:39
NikotiN, сделайте свой UserControl, в котором будут размещаться несколько LinkLabel  и на основе него сделайте новый тип DataGridViewColumn

Автор: NikotiN 28.10.2008, 10:43
да сделал я, всё же написано, не об этом речь.
речь о том, что когда я создал эти Column и Cell и добавил их в datagridview, то на экране выводятся все мои User Control, а не только для тех ячеек, которые видны на экране. смотри картинку прилепленную, там внизу висит много linklabel, хотя их меньше должно быть, но так как метод paint вызывается для видимых ячеек, то я не могу указать для остальных ячеек, которые не показаны на экране из-за скролла скрыть свои контролы

Автор: NikotiN 28.10.2008, 10:59
в общем если не конкретизировать, то мне нужно отображать любой контрол во всех ячейках столбца в режиме просмотра

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)