2015-06-13 3 views
-2

У меня есть C# DataGridView с некоторыми столбцами. Я хочу добавить столбец действий в качестве последней ячейки в каждой строке.Добавление столбца команды в DataGridView

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

+0

Вам нужно будет добавить столбец типа «DataGridViewButtonColumn» для команды __each__. Многие примеры здесь и здесь. – TaW

+0

Возможный дубликат [Как добавить кнопку в столбец в DataGridView] (http://stackoverflow.com/questions/21191950/how-to-add-a-button-to-a-column-in-the-datagridview) – TaW

+0

Спасибо, но я думаю, что моя проблема немного отличается, мне нужно добавить несколько кнопок, т. е. панель кнопок (например, «Обновление», «Удалить», «Редактировать», «Просмотр») Как я могу добавить панель кнопок, каждая из которых имеет разные действия. –

ответ

0

Вот несколько вариантов я могу думать:

  • , безусловно, проще всего добавить один Column для каждыйButton. ())
  • Из вас можно создать пользовательский тип ячейки, возможно, подкласс Panel с нужным Buttons. Это включает в себя реализацию итерации IDataGridViewEditingControl с по меньшей мере дюжиной полей и методов, а также два пользовательских класса, полученных из DataGridViewColumn и DataGridViewCell, и многое другое. Короче говоря, огромный количество работы! Для сложного управления редактированием, возможно, стоит того. Для нескольких Buttons конечно нет! (Не рекомендуется!)
  • Или вы могли бы поддельныеButtons от маленького владельца рисования магии в CellPainting события. Смотри ниже..!
  • Или вы можете добавить один сложный элемент управления за пределамиDataGridView, который действует в текущей строке. обычный way!

Вот забавный пример, что владелец рисует четыре команды «Sidu» в 4-м Column в виде DatagGridView DGV:

enter image description here

private void Form1_Load(object sender, EventArgs e) 
{ 
    DGV.Rows.Add(12); 
    for(int i = 0; i< DGV.Rows.Count; i++) 
    { 
     DGV[0, i].Value = i; 
     DGV[1, i].Value = R.Next(1000); 
     DGV[2, i].Value = rights[R.Next(rights.Count)]; 
     DGV[3, i].ReadOnly = true; 
    } 
} 

List<string> rights = new List<string> 
    { "SIDU", "SID-", "SI-U", "S-DU", "SI--", "S--U", "S-D-", "S---" }; 
Dictionary<char, string> rightsTexts = new Dictionary<char, string> 
    { { 'S', "Select" }, { 'I', "Insert" }, { 'D', "Delete" }, { 'U', "Update" } }; 
Random R = new Random(1); 


private void DGV_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.ColumnIndex == 3 && e.RowIndex >= 0) 
    { 
     string r = DGV[2,e.RowIndex].Value.ToString(); 
     StringFormat format = new StringFormat() 
     { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center}; 

     int w = e.CellBounds.Width/4; 
     int y = e.CellBounds.Y + 1; 
     int h = e.CellBounds.Height - 2; 

     e.PaintBackground(e.CellBounds, false); 

     for (int i = 0; i < 4; i++) 
     { 
      int x = e.CellBounds.X + i * w; 
      Rectangle rect = new Rectangle(x, y, w, h); 
      ControlPaint.DrawButton(e.Graphics, rect, ButtonState.Normal); 
      if (rightsTexts.ContainsKey(r[i])) 
       e.Graphics.DrawString(rightsTexts[r[i]], DGV.Font, 
            SystemBrushes.WindowText, rect ,format); 
     } 
     e.Handled = true; 
    } 
} 

private void DGV_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.ColumnIndex == 3 && e.RowIndex >= 0) 
    { 
     DataGridViewCell cell = DGV[e.ColumnIndex, e.RowIndex]; 
     int w = cell.Size.Width; 
     int buttonIndex = e.X * 4/w; 
     Text = rightsTexts.ElementAt(buttonIndex).Value; 
    } 
} 

Розыгрыша материал был выброшен вверх, а q & d, так что вы могли бы инвестировать намного больше внимания, чтобы его точно настроить.

Я выбрал отображение прав в видимой ячейке для демострата ион. Для производства значение ячейки действия было бы очевидным местом.

Смежные вопросы