Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несколько ссылок в одной ячейке DataGridView 
:(
    Опции темы
NikotiN
Дата 28.10.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



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


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
NikotiN
Дата 28.10.2008, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



я так и делаю. прошу прощения не уточнил метод 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);
            }
        }
    }

PM MAIL   Вверх
Partizan
Дата 28.10.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



NikotiN, а зачем все эти танцы с отрисовкой тогда?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
NikotiN
Дата 28.10.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



а как мне выводить эти LinkLabel несчастные?
получается вот так: внизу то, что надо исправить - не скрываются LinkLabel от невидимых ячеек
user posted image
в общем вот минимизированный пример, как сделать так, чтобы скрывались 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));
        }
    }


Это сообщение отредактировал(а) NikotiN - 28.10.2008, 10:36
PM MAIL   Вверх
Partizan
Дата 28.10.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



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


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
NikotiN
Дата 28.10.2008, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



да сделал я, всё же написано, не об этом речь.
речь о том, что когда я создал эти Column и Cell и добавил их в datagridview, то на экране выводятся все мои User Control, а не только для тех ячеек, которые видны на экране. смотри картинку прилепленную, там внизу висит много linklabel, хотя их меньше должно быть, но так как метод paint вызывается для видимых ячеек, то я не могу указать для остальных ячеек, которые не показаны на экране из-за скролла скрыть свои контролы
PM MAIL   Вверх
NikotiN
Дата 28.10.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 30.7.2006

Репутация: нет
Всего: нет



в общем если не конкретизировать, то мне нужно отображать любой контрол во всех ячейках столбца в режиме просмотра
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0719 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.