WinForm — сводка DataGridView

искусственный интеллект
  1. Общие свойства
  • Свойство CurrentCell

Получает или задает текущую активную ячейку. Синтаксис: public DataGridViewCell currentCell{get;set;}

Значением по умолчанию является первая ячейка в первом столбце или пустая ссылка, если в элементе управления нет ячеек.

Пример: DataGridView1.CurrentCell=DataGridView1[0,0];

Способ отмены выбранной по умолчанию строки 1. dataGridView1.CurrentCell=null;

  1. dataGridView1.ClearSelection();
  2. dataGridView1.Row[0].Selected=false;
  • Свойство SelectionMode

Получает или задает значение способа выбора ячеек DataGridView. Является одним из значений перечисления DataGridViewSelectionMode.

CellSelect Можно выбрать одну или несколько ячеек.
ColumnHeaderSelect Этот столбец можно выбрать, щелкнув единицу ячейки заголовка. Эту ячейку можно выбрать отдельно, щелкнув ячейку.
FullColumnSelect Выберите весь столбец, щелкнув заголовок столбца или ячейку, содержащуюся в столбце.
FullRowSelect Вся строка выделяется щелчком по заголовку строки или ячейкам, содержащимся в строке.
RowHeaderSelect Выберите строку, щелкнув ячейку заголовка строки. Ячейку можно выделить отдельно, щелкнув по ней.

Задайте для свойства SelectionMode DataGridView значение FullRowSelect.

Это заставляет DataGridView не выбирать поле, а выбирать всю строку

  • Свойство Алловусертоаддровс

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

Значение true, если пользователю отображается опция «добавить строку»; значение false, чтобы удалить добавленную по умолчанию новую строку.

  • Свойство FirstDisplayedScrollingRowIndex

Получает или задает индекс строки, которая является первой строкой, отображаемой в System.Windows.Forms.DataGridView.

Способ сделать выбранную строку DataGridView видимым диапазоном:

int rowIndex=DataGridView1.SelectedRows[0].Index;

DataGridView1. FirstDisplayedScrollingRowIndex=rowIndex;

  • Свойство CurrentCellAddress

Получает или задает строку и столбец текущей ячейки. Текущая ячейка — это ячейка, в которой находится DataGridView, которую можно получить с помощью свойства CurrentCell DataGridView. Используйте CurrentCellAddress для определения строки ячейки DataGridView.CurrentCellAdress.Y и столбца: DataGridView.CurrentCellAdress.X.

  • Свойство Дефаултселлстиле

Получает или задает стиль ячейки по умолчанию, применяемый к ячейкам в DataGridView, если не заданы другие свойства стиля ячейки. Чтобы стилизовать одну линию:

dataGrid.Row[2]. DefaultCellStyle.BackColor=Color.Green;

dataGrid.Row[2].DefaultCellStyle.Font = new System.Drawing.Font("Song Ti",9,System.Drawing.FontStyle.strikeout);

  • Свойство RowHeadersVisible

Получает или задает значение, указывающее, виден ли заголовок.

  • Свойство AutoGenerateColumns

Получает или задает значение, указывающее, создаются ли столбцы автоматически при установке свойства System.Windows.Forms.DataGridView.DataSource или System.Windows.Forms.DataGridView.DataMember.

Значение true, если столбец должен быть создан автоматически, в противном случае — значение false. Значение по умолчанию верно.

  • Свойство Алловусерторесизеколумнс

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

  • Свойство Алловусерторесизеровс

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

  1. Общие события
  • Событие CurrentCellDirtyStateChanged

Когда содержимое ячейки изменилось, но изменения не были сохранены, ячейка помечается как измененная. Это событие обычно происходит, когда ячейка была изменена, но изменения не были зафиксированы в кэше данных, или когда операция редактирования отменена.

Вызовите метод CommitEdit в обработчике событий CurrentCellDirtyStateChanged, чтобы вызвать событие CellValueChanged. Можно решить, что DataGridView не может вовремя реагировать на изменения значения Combobox.

private void dataGridView1_ColumnDefaultCellStyleChanged(object sender, DataGridViewColumnEventArgs e)

        {

            if (this.dataGridView1.IsCurrentCellDirty == true)

            {

                this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

            }

        }

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

  • Событие CellClick

Происходит при щелчке любой части ячейки.

пример:

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

    {

       string aa = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();

}

  • Событие CellValueChanged

Событие DataGridView.CellValueChanged возникает при отправке указанного пользователем значения, обычно когда фокус покидает ячейку.

Но для ячеек с флажками вы, как правило, хотите немедленно обрабатывать изменения. Чтобы зафиксировать изменения при щелчке ячейки, необходимо обработать событие DataGridView.CurrentCellDirtyStateChanged. В обработчике, если текущая ячейка является флажком, вызовите метод DataGridView.CommitEdit, передав значение Commit.

Строки в элементе управления не сортируются автоматически при изменении значения ячейки. Чтобы отсортировать элемент управления, когда пользователь изменяет ячейку, вызовите метод Sort в обработчике событий CellValueChanged.

  1. Пример использования
  • DataGridView по умолчанию отменяет выбор строк.

        DataGridView1.ClearSelection();

или

dataGridView1.CurrentCell=null;

или

dataGridView1.Row[0].Selected=false;

  • Поймите, что в столбец можно вводить только числа

При разработке проекта в последнее время требуется, чтобы в определенную колонку можно было вводить только цифры, а другие символы не принимались, Microsoft не предоставляет эту функцию.

Реализовать могу только сам, нашел в интернете, и большинство из них верифицируются после завершения ввода. Это неприятно, мой код может блокировать нечисловые символы при вводе. В основном делается в событии EditingControlShowing. см. код:

public DataGridViewTextBoxEditingControl CellEdit = null; // объявляем CellEdit

  private void datagridyf_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)  

        {  

CellEdit = (DataGridViewTextBoxEditingControl)e.Control;// присваивание

            CellEdit.SelectAll();  

CellEdit.KeyPress += Cells_KeyPress;// привязка к событию

        }  

// пользовательское событие

        private void Cells_KeyPress(object sender, KeyPressEventArgs e)  

        {  

Если (datagridyf.cerrentCelladdress.x == 2) // Определите текущий столбец, не является столбцом, который я хочу управлять, это управлять значением индекса столбца 2 (т. Е. Третий столбец)

            {  

                if ((Convert.ToInt32(e.KeyChar) < 48 || Convert.ToInt32(e.KeyChar) > 57) && Convert.ToInt32(e.KeyChar) != 46 && Convert.ToInt32(e.KeyChar) != 8 && Convert.ToInt32(e.KeyChar) != 13)  

                {  

E.chandled = True; // Если вход незаконно, он будет заблокирован

                }  

                else 

                {  

                    if ((Convert.ToInt32(e.KeyChar) == 46) && (txtjg.Text.IndexOf(".") != -1))  

                    {  

                        e.Handled = true;  

                    }  

                }  

            }  

        }  

После завершения ввода проверяется следующее, в основном это делается в событии CellValidating.

private void datagridyf_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)  

        {  

            if (e.ColumnIndex == datagridyf.Columns["Pric"].Index )  

            {  

                datagridyf.Rows [e.RowIndex].ErrorText ="";  

                int NewVal=0;  

                if (!int.TryParse (e.FormattedValue.ToString (),out NewVal ) || NewVal <0)  

                {  

                    e.Cancel=true ;   

Datagridyf.Rows[e.RowIndex].ErrorText="В столбец цены можно вводить только числа"; 

                    return ;  

                }  

            }  

        }   

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

private void Form1_Load(object sender, EventArgs e)

        {

            dataGridView1.Columns[0].Frozen = true;

dataGridView1.Columns[1].Frozen = true;//Исправляем первые два столбца, при прокрутке положение первых двух столбцов остается неизменным.

            for (int i = 0; i < 10; i++)

            {

                dataGridView1.Rows.Add("11", 2, 3, 4, 5, 6, 7, 7, 8, 8, 9, 9, 9);

            }

        }

  • Перемещение вверх и вниз по строке

/*DataGridView реализует движение строки [Row] вверх и вниз, здесь я использовал SelectedRows[0], и есть причина, по которой CurrentRow не используется

В основном эти две части кода:

   dataGridView1.Rows[rowIndex - 1].Selected = true;

   dataGridView1.Rows[rowIndex].Selected = false;

Каждый должен быть в состоянии понять эти две строки кода: строка, которая перемещается вверх, выделяется, а строка, которая перемещается вниз, не выделяется.

Если я использую dataGridView1.CurrentRow.Cell[0].Value, значение, которое он получает, по-прежнему является значением строки индекса rowIndex.

Чтобы использовать SelectedRows[0], необходимо установить это свойство: dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

Принцип реализации: Это две строки вверх и вниз, и значения в ячейках меняются местами... Хе-хе, кажется, что это движение вверх и вниз по поверхности

*/

    private void Form3_Load(object sender, EventArgs e)

    {

//........ Код для получения DataTable опущен....

// Двигаемся вверх

        private void btnMoveUp_Click(object sender, EventArgs e)

        {

// выбранный номер строки

            int selectedRowIndex = GetSelectedRowIndex(this.dataGridView1);

            if (selectedRowIndex >= 1)

            {

// копируем выбранную строку

                DataGridViewRow newRow = dataGridView1.Rows[selectedRowIndex];

// удаляем выбранную строку

                dataGridView1.Rows.Remove(dataGridView1.Rows[selectedRowIndex]);

// Вставляем скопированную строку в предыдущую выбранную строку

                dataGridView1.Rows.Insert(selectedRowIndex - 1, newRow);

// выбираем изначально выбранную строку

                dataGridView1.Rows[selectedRowIndex - 1].Selected = true;

            }

        }

// двигаться вниз

        private void btnMoveDown_Click(object sender, EventArgs e)

        {

            int selectedRowIndex = GetSelectedRowIndex(this.dataGridView1);

            if (selectedRowIndex < dataGridView1.Rows.Count-1)

            {

// копируем выбранную строку

                DataGridViewRow newRow = dataGridView1.Rows[selectedRowIndex];

// удаляем выбранную строку

                dataGridView1.Rows.Remove(dataGridView1.Rows[selectedRowIndex]);

// Вставляем скопированную строку в следующую выбранную строку

                dataGridView1.Rows.Insert(selectedRowIndex + 1, newRow);

// выбираем изначально выбранную строку

                dataGridView1.Rows[selectedRowIndex + 1].Selected = true;

            }

        }

// Получить порядковый номер выбранной строки в DataGridView

        private int GetSelectedRowIndex(DataGridView dgv)

        {

            if(dgv.Rows.Count==0)

            {

                return 0;

            }

           

            foreach(DataGridViewRow row in dgv.Rows)

            {

                if (row.Selected)

                {

                    return row.Index;

                }

            }

            return 0;

        }

// Показать серийный номер, номер строки

        private void dataGridView1_RowPostPaint(object sender,DataGridViewRowPostPaintEventArgs e)

        {

            Rectangle rectangle = new Rectangle(e.RowBounds.Location.X,

                            e.RowBounds.Location.Y,

                            dataGridView1.RowHeadersWidth - 4,

                            e.RowBounds.Height);            TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(),

                dataGridView1.RowHeadersDefaultCellStyle.Font,rectangle,

                dataGridView1.RowHeadersDefaultCellStyle.ForeColor,

                TextFormatFlags.VerticalCenter | TextFormatFlags.Right);

        }         

Обнаруживает изменение значения ячейки, когда текущая активная ячейка находится в состоянии редактирования, и получает значение. (DataGridView — составной элемент управления, нет возможности получить значение в состоянии редактирования)

  • Поймите, что текущая активная ячейка получает изменение значения ячейки в состоянии редактирования.

Первый способ:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)

        {

            if (this.dataGridView1.IsCurrentCellDirty == true)

            {

                this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

            }

        }

        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)

        {

            MessageBox.Show("aaaa");

        }

Второй способ:

private void dgrMenuItem_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)

{

    if (e==null ||e.Control)

        return;

    e.Control.TextChanged+=new EventHander(Control_TextChanged);

}

void Control_TextChanged(object sender,EventArgs e)

{

MessageBox.Show("ОК");

if (dgrMenItem.CurrentCellAdress.X==3)

{

        string val=dgrMenuItem.CurrentCell.EditedFormattedValue.ToString();

}

//Другой способ получить

Control txt=Sender as Control;

if (dgrMenItem.CurrentCellAdress.X==3)

{

    string val=txt.Text;

}

}

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

Установите для параметра SelectionMode DataGridView значение FullRowSelect.

Используйте событие EditingControlShowing для вызова события раскрывающегося элемента управления.

private bool isInit=false;

private void dgrdThridLangage_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)

{

if (e==null|| e.Control==null)
{

    return;

}

if (e.Control is ComboBox)

{

    ComboBox cmb=e.Control as ComboBox;

    cmb.SelectedIndexChanged+=new EventHander(cmb_SelectIndexChanged);

}

}

void cmb_SelectedIndexChanged(object sender,EventArgs e)

{

    if (isInit==true)

{

    return;

}

ComboBox result=sender as ComboBox;

if (!string.IsNullOrEmpty(relust.Text))

{

    string foreignName=relust.Text;

    if (plurDic.ContainsKey(foreignName))

{

MessageBox.Show("Уже существует, измените язык");

isInit=true;//Установите флаг, чтобы повторное выполнение не образовывало бесконечный цикл.

    result.SelectedIndex=-1;

    isInit=false;

return;

}

}

}

  • Добавьте флажок в заголовок DatGridView, чтобы выбрать и очистить все столбцы.

 

   

public partial class Form1 : Form

    {

        CheckBox HeaderCheckBox = null;

        public Form1()

        {

            InitializeComponent();

            if (!this.DesignMode)

            {

                HeaderCheckBox = new CheckBox();

                HeaderCheckBox.Size = new Size(15, 15);

                HeaderCheckBox.Text = "";

                this.dataGridView1.Controls.Add(HeaderCheckBox);

                HeaderCheckBox.CheckedChanged += HeaderCheckBox_CheckedChanged;

                dataGridView1.CellPainting += DataGridView1_CellPainting;

            }

            AddData();

        }

        private void AddData()

        {

            for (int i = 0; i < 10; i++)

            {

                dataGridView1.Rows.Add(false, "2", "3", "4");

            }

        }

        private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)

        {

            if (e.RowIndex == -1 && e.ColumnIndex == 4)

            {

                ResetHeaderCheckBoxLocation(e.ColumnIndex, e.RowIndex);

            }

        }

        private void HeaderCheckBox_CheckedChanged(object sender, EventArgs e)

        {

            HeaderCheckBoxClick((CheckBox)sender);

        }

        private void HeaderCheckBoxClick(CheckBox checkBox)

        {

            foreach (DataGridViewRow row in dataGridView1.Rows)

            {

                ((DataGridViewCheckBoxCell)row.Cells[0]).Value = HeaderCheckBox.Checked;

            }

            dataGridView1.RefreshEdit();

        }

        private void ResetHeaderCheckBoxLocation(int columnIndex, int rowIndex)

        {

            Rectangle rectangle = this.dataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, true);

            Point point = new Point(rectangle.Location.X + 3, rectangle.Location.Y + 3);

            HeaderCheckBox.Location = point;

        }

    }

}

  • Привязать данные к раскрывающемуся списку

 

Идея: объявить глобальную коллекцию типа словаря, поместить данные в коллекцию, имя данных используется как ключ словаря, идентификатор используется как значение словаря, а имя добавляется в столбец.

       Dictionary<string, string> dic = new Dictionary<string, string>();

       

        private void button1_Click(object sender, EventArgs e)

        {

            dic.Add("AA", "OA");

            dic.Add("BB", "HH");

            DataGridViewComboBoxColumn cmbDep = (DataGridViewComboBoxColumn)dataGridView1.Columns[0];

            foreach (string name in dic.Keys)

            {

                if (!cmbDep.Items.Contains(name))

                {

                    cmbDep.Items.Add(name);

                }

            }

        }

  • Проверяйте ячейки DataGridView, и фокус не уходит после ошибок проверки

Идеи:

Проверка ячейки использует событие CellValidating. Вызовите e.Cancel=true, когда проверка завершится неудачно; завершите цепочку событий, надеюсь, состояние редактирования останется.

Вызовите DataGridView.CancelEdit, чтобы откатить содержимое ячейки до значения до модификации. Используйте System.Windows.Forms.SendKey.Send("^a");, чтобы выбрать содержимое всех ячеек.

Код:

private void dataGridView1_CellValidating(object sender,DataGridViewCellValidatingEventArgs e)

{

         if (e.RowIndex<0)

                   return;

         if (e.ColumnIndex!=2)

Возврат;//Непроверенные столбцы не выполняются

         bool isTrue=false;

//логика проверки

if(b==false)//Указывает, что проверка не удалась

{

MessageBox.show("Не проверено");

         e.Cancel=true;

         dataGridView1.CancelEdit();

         dataGridView1.CurrentCell=dataGridView1[e.ColumnIndex,e.RowIndex];

         dataGridView1.BeginEdit(false);

}

}

  • Управление столбцом Button в DataGridView

private void dataGridView1_CellContentClick(object sender,DataGridViewCellEventArgs e)

{

         if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType()==typeof(DataGridViewButtonCell))

{dataGridView1.Rows.RemoveAt(e.RowIndex);}

}

  • Преобразование DataGridView в DataTable

Вы можете назначать значения напрямую, когда DataSource DataGridView является DataTable.

Когда DataGridView заполняет данные путем обхода, используется следующий метод, когда нет источника данных или источник данных не является типом DataTable.

  public System.Data.DataTable GetDataTable(DataGridView dataGridView)

        {

            System.Data.DataTable dt = new System.Data.DataTable();

            for (int count = 0; count < dataGridView.ColumnCount; count++)

            {

                DataColumn dataColumn = new DataColumn(dataGridView1.Columns[count].Name.ToString());

                dt.Columns.Add(dataColumn);

            }

            for (int count = 0; count < dataGridView1.Columns.Count; count++)

            {

                DataRow dr = dt.NewRow();

                for (int countsub = 0; countsub < dataGridView.Columns.Count; countsub++)

                {

                    dr[countsub] = Convert.ToString(dataGridView.Rows[count].Cells[countsub].Value);

                }

                dt.Rows.Add(dr);

            }

            return dt;

        }

  • Данные перемещаются вверх и вниз с помощью колеса прокрутки мыши.

Используемое событие — это событие MouseWheel.

dataGridView.MouseWheel+=new MouseEventHandler(dataGridView_MouseWheel);

dataGridView.TabIndex=0;

void dataGridView_MouseWheel(object sender,MouseEventArgs e)

{

         if (dataGridView.RowCount>dataGridView.DisplayRowCount(false))

{

         int index=dataGridView.FirstDisplayScrollingRowIndex;

         if (e.Delta>0)

         {

                   if (index>0)

                   {

                            dataGridView.FirstDisplayScrollingRowIndex=index-1;

}

}

else

{

         if(index<dataGridView.Row.Count-1)

         {

                   dataGridView.FirstDisplayScrollingRowIndex=index+1;

}

}

}

}

  • многомерный заголовок

 

Создайте новый компонент и напишите TreeHeadDataGridView.cs

using System;

using System.ComponentModel;

using System.Collections.Generic;

using System.Diagnostics;

using System.Text;

using System.Windows.Forms;

using System.Collections;

using System.Drawing;

 

namespace CellPaintingDataGridView

{

    public partial class TreeHeadDataGridView : DataGridView

    {

        private TreeView treeView1=new TreeView();

        public TreeHeadDataGridView()

        {

            InitializeComponent();

        }

        public TreeHeadDataGridView(IContainer container)

        {

            container.Add(this);

            InitializeComponent();

        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

        public TreeNodeCollection HeadSource

        {

            get { return this.treeView1.Nodes; }

        }

        private int _cellHeight = 17;

        private int _columnDeep = 1;

[Description("Установить или получить глубину дерева заголовков слияния")]

        public int ColumnDeep

        {

            get

            {

                if (this.Columns.Count == 0)

                    _columnDeep = 1;

                this.ColumnHeadersHeight = _cellHeight * _columnDeep;

                return _columnDeep;

            }

            set

            {

                if (value < 1)

                    _columnDeep = 1;

                else

                    _columnDeep = value;

                this.ColumnHeadersHeight = _cellHeight * _columnDeep;

            }

        }

        ///<summary>

///Рисуем заголовок слияния

        ///</summary>

///Объединить узел заголовка

///Набор параметров рисования

///глубина узла

        ///<remarks></remarks>

        public void PaintUnitHeader(TreeNode node, DataGridViewCellPaintingEventArgs e, int level)

        {

//Выходим из рекурсивного вызова на корневом узле

            if (level == 0)

                return;

            RectangleF uhRectangle;

            int uhWidth;

            SolidBrush gridBrush = new SolidBrush(this.GridColor);

            Pen gridLinePen = new Pen(gridBrush);

            StringFormat textFormat = new StringFormat();

            textFormat.Alignment = StringAlignment.Center;

            uhWidth = GetUnitHeaderWidth(node);

// Отличие от исходного алгоритма здесь.

            if (node.Nodes.Count == 0)

            {

                uhRectangle = new Rectangle(e.CellBounds.Left,

                            e.CellBounds.Top + node.Level * _cellHeight,

                            uhWidth - 1,

                            _cellHeight * (_columnDeep - node.Level) - 1);

            }

            else

            {

                uhRectangle = new Rectangle(

                            e.CellBounds.Left,

                            e.CellBounds.Top + node.Level * _cellHeight,

                            uhWidth - 1,

                            _cellHeight - 1);

            }

            Color backColor = e.CellStyle.BackColor;

            if (node.BackColor != Color.Empty)

            {

                backColor = node.BackColor;

            }

            SolidBrush backColorBrush = new SolidBrush(backColor);

// рисуем прямоугольник

            e.Graphics.FillRectangle(backColorBrush, uhRectangle);

// подчеркивание

            e.Graphics.DrawLine(gridLinePen

                                , uhRectangle.Left

                                , uhRectangle.Bottom

                                , uhRectangle.Right

                                , uhRectangle.Bottom);

// рисуем правую конечную линию

            e.Graphics.DrawLine(gridLinePen

                                , uhRectangle.Right

                                , uhRectangle.Top

                                , uhRectangle.Right

                                , uhRectangle.Bottom);

написать текст поля

            Color foreColor = Color.Black;

            if (node.ForeColor != Color.Empty)

            {

                foreColor = node.ForeColor;

            }

            e.Graphics.DrawString(node.Text, this.Font

                                    , new SolidBrush(foreColor)

                                    , uhRectangle.Left + uhRectangle.Width / 2 -

                                    e.Graphics.MeasureString(node.Text, this.Font).Width / 2 - 1

                                    , uhRectangle.Top +

                                    uhRectangle.Height / 2 - e.Graphics.MeasureString(node.Text, this.Font).Height / 2);

Рекурсивный вызов()

            if (node.PrevNode == null)

                if (node.Parent != null)

                    PaintUnitHeader(node.Parent, e, level - 1);

        }

        /// <summary>

/// Получаем ширину объединенного поля заголовка

        /// </summary>

/// Узел поля

/// Ширина поля

        /// <remarks></remarks>

        private int GetUnitHeaderWidth(TreeNode node)

        {

//получаем ширину не самого нижнего поля

            int uhWidth = 0;

//получаем ширину самого нижнего поля

            if (node.Nodes == null)

                return this.Columns[GetColumnListNodeIndex(node)].Width;

            if (node.Nodes.Count == 0)

                return this.Columns[GetColumnListNodeIndex(node)].Width;

            for (int i = 0; i <= node.Nodes.Count - 1; i++)

            {

                uhWidth = uhWidth + GetUnitHeaderWidth(node.Nodes[i]);

            }

            return uhWidth;

        }

        /// <summary>

/// Получить базовый индекс поля

        /// </summary>

/// Нижний узел поля

/// Индекс

        /// <remarks></remarks>

        private int GetColumnListNodeIndex(TreeNode node)

        {

            for (int i = 0; i <= _columnList.Count - 1; i++)

            {

                if (((TreeNode)_columnList[i]).Equals(node))

                    return i;

            }

            return -1;

        }

        private List<TreeNode> _columnList = new List<TreeNode>();

[Описание("Самый нижний набор узлов")]

        public List<TreeNode> NadirColumnList

        {

            get

            {

                if (this.treeView1 == null)

                    return null;

                if (this.treeView1.Nodes == null)

                    return null;

                if (this.treeView1.Nodes.Count == 0)

                    return null;

                _columnList.Clear();

                foreach (TreeNode node in this.treeView1.Nodes)

                {

                    //GetNadirColumnNodes(_columnList, node, false);

                    GetNadirColumnNodes(_columnList, node);

                }

                return _columnList;

            }

        }

        private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node)

        {

            if (node.FirstNode == null)

            {

                alList.Add(node);

            }

            foreach (TreeNode n in node.Nodes)

            {

                GetNadirColumnNodes(alList, n);

            }

        }

        /// <summary>

/// Получить базовую коллекцию полей

        /// </summary>

/// Основная коллекция полей

/// Узел поля

/// Искать или нет

        /// <remarks></remarks>

        private void GetNadirColumnNodes(List<TreeNode> alList, TreeNode node, Boolean isChecked)

        {

            if (isChecked == false)

            {

                if (node.FirstNode == null)

                {

                    alList.Add(node);

                    if (node.NextNode != null)

                    {

                        GetNadirColumnNodes(alList, node.NextNode, false);

                        return;

                    }

                    if (node.Parent != null)

                    {

                        GetNadirColumnNodes(alList, node.Parent, true);

                        return;

                    }

                }

                else

                {

                    if (node.FirstNode != null)

                    {

                        GetNadirColumnNodes(alList, node.FirstNode, false);

                        return;

                    }

                }

            }

            else

            {

                if (node.FirstNode == null)

                {

                    return;

                }

                else

                {

                    if (node.NextNode != null)

                    {

                        GetNadirColumnNodes(alList, node.NextNode, false);

                        return;

                    }

                    if (node.Parent != null)

                    {

                        GetNadirColumnNodes(alList, node.Parent, true);

                        return;

                    }

                }

            }

        }

        /// <summary>

/// рисование ячеек (переопределение)

        /// </summary>

        /// <param name="e"></param>

        /// <remarks></remarks>

        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)

        {

// Заголовки строк не перезаписываются

            if (e.ColumnIndex < 0)

            {

                base.OnCellPainting(e);

                return;

            }

            if (_columnDeep == 1)

            {

                base.OnCellPainting(e);

                return;

            }

// рисуем заголовок

            if (e.RowIndex == -1)

            {

                PaintUnitHeader((TreeNode)NadirColumnList[e.ColumnIndex], e, _columnDeep);

                e.Handled = true;

            }

        }

    }

}

Затем вы можете увидеть компоненты, которые вы только что написали, в наборе инструментов.

 

Перетащите его в форму, нажмите HeadSource, чтобы добавить заголовок

 

    private void Form1_Load(object sender, EventArgs e)

    {

            TreeNode node=new TreeNode();

            node.Text="wh";

            treeHeadDataGridView1.HeadSource.Add(node);

     }

  • Добавить итоговую строку

Добавьте общую строку для поддержки перетаскивания строки влево и вправо и поддержки колеса прокрутки мыши.

 

макет:

 

Идеи:

  1. DataGridView в разделе данных без поля прокрутки
  2. DataGridView для агрегированного раздела с горизонтальной полосой прокрутки
  3. Добавьте вертикальную полосу прокрутки vscrollBar1 на экран

Идея реализации состоит в том, чтобы использовать горизонтальную полосу прокрутки общей строки для управления горизонтальной прокруткой двух DataGridView и вертикальную полосу прокрутки справа для управления DataGridView части данных Эффект состоит в том, что общая строка всегда отображается внизу.

дизайн страницы:

  1. Поместите DataGridView области отображения данных и общей области данных в DateGridView. Высота общей области составляет 40 пикселей.
  2. Настройки DataGridView для области данных:

DataGridView1.AllowUserToAddRows=False;

DataGridView1.ScroBars=None;

DataGridView1.SelectionMode=DataGridViewsSelectionMode.FullRowSelect;

DataGridView1.ColumnWidthChanged+=new DataGridViewColumnEventHandler(DataGridView1_ColumnWidthChanged);

  1. Настройка общей площади данных.

DataGridViewSum. AllowUserToAddRows=False;

DataGridViewSum.AllowUserToResizeColumns=False;//столбцы нельзя перетаскивать

DataGridViewSum.Anchor=Buttom,Left,Right;

DataGridViewSum.ColumnHeadersHeightSizeMode=System.Windows.Forms.DataGridViewColumnHeader.HeightSizeMode.AutoSize;

DataGridViewSum.ColumnsHeadersVisible=false;

DataGridViewSum.ReadOnly=true;

DataGridViewSum.ScrollBars=System.Windows.Forms.ScrollBars.Horizontal;

  1. Настройки элемента управления vscrollBar1

vscrollBar1.Anchor=Top,Button,Right;

this. vscrollBar1.visibleChanged+=new System.EventHander(vscrollBar1_VisibleChanged);

this. vscrollBar1.Scroll+=new System.Windows.Forms.ScrollEventHandler(vscrollBar1_Scroll);

Код:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication11

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private DataTable dt = new DataTable();

        private DataTable dtSum;

     

        private int Row_Height = 21;

        private void Form1_Load(object sender, EventArgs e)

        {

            VScrollBar1.Visible = false;

        }

        private void kButton1_Click(object sender, EventArgs e)

        {

            dt = GetData();

            this.kDataGridView1.AutoGenerateColumns = false;

            this.kDataGridView1.DataSource = dt;

            this.kDataGridView1.Columns[0].DataPropertyName = dt.Columns[0].ColumnName;

            this.kDataGridView1.Columns[1].DataPropertyName = dt.Columns[1].ColumnName;

            this.kDataGridView1.Columns[2].DataPropertyName = dt.Columns[2].ColumnName;

            this.kDataGridView1.Columns[3].DataPropertyName = dt.Columns[3].ColumnName;

            this.kDataGridView1.Columns[4].DataPropertyName = dt.Columns[4].ColumnName;

            this.kDataGridView1.Columns[5].DataPropertyName = dt.Columns[5].ColumnName;

            this.kDataGridView1.Columns[6].DataPropertyName = dt.Columns[6].ColumnName;

            this.kDataGridView1.Columns[7].DataPropertyName = dt.Columns[7].ColumnName;

            this.kDataGridView1.Columns[8].DataPropertyName = dt.Columns[8].ColumnName;

            this.kDataGridView1.Columns[9].DataPropertyName = dt.Columns[9].ColumnName;    

            this.kDataGridView1.RowTemplate.Height = Row_Height;

            GetSumData();

            if (kDataGridView1.RowCount > kDataGridView1.DisplayedRowCount(false))

            {

                VScrollBar1.Visible = true;

                VScrollBar1.Maximum = (this.kDataGridView1.Rows.Count - this.kDataGridView1.DisplayedRowCount(false)) * Row_Height;

                VScrollBar1.Minimum = 0;

                VScrollBar1.SmallChange = 21;

                VScrollBar1.LargeChange = 50;

            }

        }

        private DataTable GetData()

        {

            DataTable dtData = new DataTable("TEST");

           DataRow dr ;

dt.Columns.Add(new DataColumn("Число", typeof(String)));

dt.Columns.Add(new DataColumn("Число 1", typeof(int)));

dt.Columns.Add(new DataColumn("Число 2", typeof(int)));

dt.Columns.Add(new DataColumn("Число 3", typeof(int)));

dt.Columns.Add(new DataColumn("Число 4", typeof(int)));

dt.Columns.Add(new DataColumn("Число 5", typeof(int)));

dt.Columns.Add(new DataColumn("Число 6", typeof(int)));

dt.Columns.Add(new DataColumn("Число 7", typeof(int)));

dt.Columns.Add(new DataColumn("Число 8", typeof(int)));

dt.Columns.Add(new DataColumn("Число 9", typeof(int)));

            Random rdm = new Random();

            for (int i = 10; i < 80; i++)

            {

                dr = dt.NewRow();

                dr[0] = ("00" + i).ToString();

                for (int j = 1; j < 10; j++)

                {

                    dr[j] = rdm.Next(1000, 5000);

                }

                dt.Rows.Add(dr);

            }

            return dt;

        }

        private void GetSumData()

        {

            DataRow dr;

            dtSum = new DataTable("TEST");

            dtSum = dt.Clone();

            Random rdm = new Random();

            dr = dtSum.NewRow();

др[0] = "Всего";

            for (int i = 1; i < dt.Columns.Count - 1; i++)

            {

                dr[i] = dt.Compute("Sum(" + dt.Columns[i].ColumnName + ")", "true");

            }

            dtSum.Rows.Add(dr);

            this.kDataGridView2.AutoGenerateColumns = false;

            this.kDataGridView2.DataSource = dtSum;

            this.kDataGridView2.Columns[0].DataPropertyName = dtSum.Columns[0].ColumnName;

            this.kDataGridView2.Columns[1].DataPropertyName = dtSum.Columns[1].ColumnName;

            this.kDataGridView2.Columns[2].DataPropertyName = dtSum.Columns[2].ColumnName;

            this.kDataGridView2.Columns[3].DataPropertyName = dtSum.Columns[3].ColumnName;

            this.kDataGridView2.Columns[4].DataPropertyName = dtSum.Columns[4].ColumnName;

            this.kDataGridView2.Columns[5].DataPropertyName = dtSum.Columns[5].ColumnName;

            this.kDataGridView2.Columns[6].DataPropertyName = dtSum.Columns[6].ColumnName;

            this.kDataGridView2.Columns[7].DataPropertyName = dtSum.Columns[7].ColumnName;

            this.kDataGridView2.Columns[8].DataPropertyName = dtSum.Columns[8].ColumnName;

            this.kDataGridView2.Columns[9].DataPropertyName = dtSum.Columns[9].ColumnName;

            this.kDataGridView2.Rows[0].DefaultCellStyle.BackColor = Color.Red;

            this.kDataGridView2.ReadOnly = true;

            this.kDataGridView2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

        }

        private void kDataGridView2_Scroll(object sender, ScrollEventArgs e)

        {

            this.kDataGridView1.HorizontalScrollingOffset = e.NewValue;

        }

        private void VScrollBar1_Scroll(object sender, ScrollEventArgs e)

        {

            this.kDataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue / Row_Height ;

        }

        private void kDataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)

        {

           

        }

        private void kDataGridView1_RowHeadersWidthChanged(object sender, EventArgs e)

        {

         

        }

        private void kDataGridView1_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)

        {

            for (int i = 0; i < kDataGridView1.ColumnCount; i++)

            {

                kDataGridView2.Columns[i].Width = kDataGridView1.Columns[i].Width;

            }

        }

      

    }

}