Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

4 вопроса по DataGridView

54K
21 ноября 2009 года
Faba
4 / / 20.11.2009
Доброго времени суток!
Пишу программу, в которой главный компонент у меня - это DataGridView. Уже замотался с ним просто.
Возникло несколько вопросов, которые я не могу решить уже несколько дней.
Вопросы:
1) Как убрать у таблицы самую левую колонку, т.е. DataGridViewRowHeaderCell?
Пытался сделать так:
 
Код:
private void dgTable_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            DataGridViewRowHeaderCell headcell = this.dgTable.RowTemplate.HeaderCell;
            headcell.Visible = false;
        }

Но он выдает ошибку:
Property or indexer 'System.Windows.Forms.DataGridViewCell.Visible' cannot be assigned to -- it is read only
Пробовал ставить на Load формы - тоже самое.
2) Как сделать так, чтобы нельзя было менять размер ячеек?
Пытался сделать так:
 
Код:
DataGridViewRow row1 = this.dgTable.RowTemplate;
row1.Height = 22;
row1.MinimumHeight = 22;


Но это никак не повлияло. все равно можно изменять размер(( Пробовал это в Load и в CellPainting. Тут же хочу спросить, MinimumHeight - есть такое (хотя оно и не работает (пока что)), но в списке свойств что-то вроде MaximumHeight не нашел..
3) Сама эта таблица находится у меня в дочернем окне (работаю с MDI-окнами). На этом окне находится справа сама таблица, слева кнопки (их количество = количеству рядов таблицы). на Главном окне есть кнопки "Add" и "Delete". При нажатии на кнопку добавления - добавляется кнопка и ряд в таблице. ну с Добавлением всё нормально работает. а Вот с удалением что-то не в порядке. Первую кнопку и первый ряд удаляет спокойно, так же как и последний. а Вот если из середины какой-то удалить, то ряд он удаляет тот, что нужно, а кнопку всё время вторую по счету(((
Код:
private void btnDelete_Click(object sender, EventArgs e)
        {
            ChildForm activeChild = (ChildForm)this.ActiveMdiChild;
            foreach (DataGridViewRow row in activeChild.dgTable.Rows)
                if (row.Selected == true)
                {
// удаление последней кнопки и рядка
                    if (row.IsNewRow)
                    {
                        for (int t = 0; t < activeChild.dgTable.Columns.Count; t++)
                            row.Cells[t].Value = activeChild.dgTable.Rows[row.Index - 1].Cells[t].Value;
                        activeChild.dgTable.Rows.RemoveAt(row.Index - 1);
                        activeChild.flPanel.Controls.RemoveAt(row.Index + 1);
                    }
                    else
                    {
// удаление первой кнопки и рядка
                        if (row.Index == 0)
                        {
                            activeChild.dgTable.Rows.RemoveAt(row.Index);
                            activeChild.flPanel.Controls.RemoveAt(row.Index + 1);
                        }
                        else
// всё остальное
                        {
                            activeChild.dgTable.Rows.RemoveAt(row.Index);
                            activeChild.flPanel.Controls.RemoveAt(row.Index + 2);
                        }
                    }
                }            
            if (activeChild.dgTable.Rows.Count == 1)
                btnDelete.Enabled = false;
        }

4) Последний вопрос. Как я и говорил на дочерней форме слева кнопки, справа таблица. Кнопки у меня установлены на FlowLayoutPanel (flPanel). Сама же flPanel установлена на обычную panel. При добавлении (или изменении размеров окна), если кнопки уже не вмещаются в клиентскую область, то появляется вертикальный скролл на panel. Так вот, сам вопрос: как мне сделать так, чтобы при перемотки скролла панели, также перематывался и скролл таблицы (и наоборот). Т.е. например: у меня 50 кнопок и следовательно 50 рядков таблицы, если я перематываю на один рядок вниз, то чтобы на панели на одну кнопку вниз тоже перемещалось и соответственно наоборот. Пробовал сделать следующим образом:
 
Код:
private void dgTable_Scroll(object sender, ScrollEventArgs e)
        {
            this.panel.VerticalScroll.Value = e.NewValue;
        }

но при перемещени скролла таблицы, когда он уже был на последнем рядке, скролл панели еще даже первую кнопку не прошел. Порпробовал подобрать, сделал:
 
Код:
this.panel.VerticalScroll.Value = e.NewValue*22;

почти, но тоже не то.. то вроде переключается, то не доходит. у меня вопрос: как можно это реализовать без каких-то подборов, а нормальным способом?
297
21 ноября 2009 года
koodeer
1.2K / / 02.05.2009
1)
dgTable.RowHeadersVisible = false;

2)
dgTable.AllowUserToResizeColumns = false;
54K
21 ноября 2009 года
Faba
4 / / 20.11.2009
Большое спасибо, заработало =)
Осталось еще два вопроса нерешенных. Завтра еще посижу, попробую что-нибудь с этим сделать. Еще раз спасибо.
19K
22 ноября 2009 года
WantToProg
63 / / 19.01.2009
Дабы не заводить новую тему, напишу свой вопрос в этой.
Мне необходимо в DataGridView загрузить данные из файла, где разделителем на колонки является определенный символ. С чтением из файла я разберусь. А вот как правильно заносить данные, через BindingSource или каким еще образом?
Прошу натолкнуть на мысль, а то что то встрял я в этом месте. Информации как обычно куча.
54K
23 ноября 2009 года
Faba
4 / / 20.11.2009
3) Все-таки получилось удалять правильно. не знаю почему но, после того как удаляется строка из таблицы, индекс уже возвращает не то, что нужно, поэтому я запоминал его в отдельной переменной. Ну и кое-что исправил, узнав например о CurrentRow))
Код:
private void btnDelete_Click(object sender, EventArgs e)
        {
            ChildForm activeChild = (ChildForm)this.ActiveMdiChild;
            DataGridViewRow row = activeChild.dgTable.CurrentRow;
            if (row.IsNewRow)
            {
                for (int t = 0; t < activeChild.dgTable.Columns.Count; t++)
                    row.Cells[t].Value = activeChild.dgTable.Rows[row.Index - 1].Cells[t].Value;
                activeChild.dgTable.Rows.RemoveAt(row.Index - 1);
                activeChild.flPanel.Controls.RemoveAt(row.Index + 1);
            }
            else
            {
                if (row.Index.Equals(0))
                {
                    activeChild.dgTable.Rows.RemoveAt(row.Index);
                    activeChild.flPanel.Controls.RemoveAt(row.Index + 1);
                }
                else
                {
                    int ind = row.Index;
                    activeChild.dgTable.Rows.RemoveAt(row.Index);
                    activeChild.flPanel.Controls.RemoveAt(ind);
                }
            }            
            if (activeChild.dgTable.Rows.Count == 1)
                btnDelete.Enabled = false;            
        }

Остался последний вопрос на счет скроллов.. если будут какие-то идеи - буду рад их услышать.
54K
24 ноября 2009 года
Faba
4 / / 20.11.2009
Натолкнули на мысль об использовании кнопок в самой таблице. Переделал код.
на Load формы поставил:
 
Код:
DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn();
buttonColumn.HeaderText = "Instruments";
buttonColumn.Name = "columnInstruments";
buttonColumn.Width = 130;
this.dgTable.Columns.Add(buttonColumn);

Затем кнопку удаления так:
Код:
private void btnDelete_Click(object sender, EventArgs e)
{
ChildForm activeChild = (ChildForm)this.ActiveMdiChild;
DataGridViewRow row = activeChild.dgTable.CurrentRow;
if (row.IsNewRow)
{
for (int t = 0; t < activeChild.dgTable.Columns.Count; t++)
row.Cells[t].Value = activeChild.dgTable.Rows[row.Index - 1].Cells[t].Value;
activeChild.dgTable.Rows.RemoveAt(row.Index - 1);
}
else
{ activeChild.dgTable.Rows.RemoveAt(row.Index);
}
if (activeChild.dgTable.Rows.Count.Equals(1))
btnDelete.Enabled = false;
}

Всё работает. И не надо никаких мучений на счет скролов. Все 4 вопроса решены. Спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог