Добавление столбцов DataGridView программно - PullRequest
5 голосов
/ 27 мая 2011

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

Одно из решений, которое я хотел бы запрограммировать, состоит в том, что, когда пользователь щелкает правой кнопкой мыши по столбцам, он может выбирать из всплывающего списка выбирать, какие столбцы отображать, а какие нет.Как на картинке ниже.enter image description here

Как я могу это сделать.Буду очень признателен за любую помощь.

1 Ответ

1 голос
/ 27 мая 2011

Этого можно добиться, используя WinForms ContextMenuStrip и свойство Visible столбцов DataGridView.

Вот пример кода, который делает то, что вы хотите:

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            BindingList<User> users = new BindingList<User>{
                  new User{Name = "John", Address="Home Street", Title="Mr."},
                  new User{Name = "Sally", Address="Home Street", Title="Mrs."}
            };

            contextMenuStrip1.AutoClose = true;       
            contextMenuStrip1.Closing += new ToolStripDropDownClosingEventHandler(contextMenuStrip1_Closing);

            dataGridView1.DataSource = users;

            dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete);
        }

        void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {

            foreach (DataGridViewColumn gridViewColumn in this.dataGridView1.Columns)
            {
                ToolStripMenuItem item = new ToolStripMenuItem();
                item.Name = gridViewColumn.Name;
                item.Text = gridViewColumn.Name;
                item.Checked = true;
                item.CheckOnClick = true;
                item.CheckedChanged += new EventHandler(item_CheckedChanged);
                contextMenuStrip1.Items.Add(item);
            }

            foreach (DataGridViewColumn gridViewColumn in this.dataGridView1.Columns)
            {
                gridViewColumn.HeaderCell.ContextMenuStrip = contextMenuStrip1;
            }

        }

        void item_CheckedChanged(object sender, EventArgs e)
        {
            ToolStripMenuItem item = sender as ToolStripMenuItem;

            if (item != null)
            {
                dataGridView1.Columns[item.Name].Visible = item.Checked;
            }
        }

        void contextMenuStrip1_Closing(object sender, ToolStripDropDownClosingEventArgs e)
        {
            if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
            {
                e.Cancel = true;
            }
        }
    }

    public class User
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string Title { get; set; }
    }

}

Класс User существует именно так, как пример компилируется, предоставляя что-то для привязки моего DataGridView.

Я также добавил некоторый код, который позволяет пользователям щелкать более одного столбца за раз (проверяя причину закрытия при закрытии и отмене, если это был выбранный элемент). По моему мнению, это на самом деле немного погранично с точки зрения отклонения от стандартного поведения пользовательского интерфейса - обычно лучше придерживаться стандартного поведения, но я включил его, поскольку это (я думаю) полезно в этом сценарии.

Кроме того, обычно удобнее помещать подобную настройку в новый элемент управления, который наследуется от DataGridView. * * 1010

...