2013-12-23 2 views
0

Попробуйте это ...
Создать Form1, не изменить размер, добавить dataGridView1 и установить якорь слева, сверху и справа, а затем ...Странное поведение на DataGridView, ориентированные клетки не прокручивать горизонтально

public class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     dataGridView1.AutoGenerateColumns = true; 
     var source = new BindingList<Comic>(GetComics()); 
     dataGridView1.DataSource = source; 
    } 

    private List<Comic> GetComics() 
    { 
     var comics = new List<Comic>(); 

     comics.Add(new Comic() { id = "1", title = "IronMan", editr = "LayneBooks", pages = 65, owned = true }); 
     comics.Add(new Comic() { id = "2", title = "The Hulk", editr = "LayneBooks", pages = 48, owned = false }); 
     comics.Add(new Comic() { id = "3", title = "Superman", editr = "DCCore", pages = 72, owned = true }); 

     return comics; 
    } 

    // Custom class, source for grid 
    private class Comic 
    { 
     public string id { get; set; } 
     public string title { get; set; } 
     public string editr { get; set; } 
     public int pages { get; set; } 
     public bool owned { get; set; } 
    } 

Как мы знаем, мы можем перейти от ячейки к ячейке с помощью клавиш со стрелками или с помощью клавиши Tab (когда StandardTab = false) и достигнуть углов сетки с помощью клавиш Ctrl +.

Все в порядке с этим кодом, ячейки сфокусированы и выбраны с помощью клавиш, но при изменении ширины столбцов невидимые ячейки сфокусированы, но не показаны.

Например, используя вышеприведенный код, если ширина первого и второго столбцов уменьшается до 20-30% от его первоначального размера, то правый угол не достигается, нажимая Ctrl + правую клавишу.
Если ширина третьей колонки также уменьшена, и мы пытаемся достичь последней с помощью правых клавиш (или Tab), ячейка фокусируется, но не отображается полностью (или абсолютно).

Как это решить ?, изменить ширину столбцов и получить тот же самый beahviour, что и при автогенерации. Есть ли какое-либо имущество, которое мне не хватает? Моя цель - перемещаться по ячейкам с помощью клавиш и показывать контекстное меню при нажатии Keys.Apps, но не может сделать это, если ячейка не видна.

Спасибо!

ответ

0

Невозможно решить эту проблему.

Пожалуйста, попробуйте этот код.

public Form1() 
{ 
    InitializeComponent(); 

    dataGridView1.AutoGenerateColumns = true; 
    var source = new BindingList<Comic>(GetComics()); 
    dataGridView1.DataSource = source; 
    dataGridView1.CurrentCellChanged += dataGridView1_CurrentCellChanged; 
} 

private void dataGridView1_CurrentCellChanged(object sender, EventArgs e) 
{ 
    if (Control.MouseButtons.HasFlag(MouseButtons.Left)) return; 
    var dgv = (DataGridView)sender; 

    if (dgv.CurrentCell == null) return; 

    var dispWidth = dgv.ClientSize.Width - dgv.CurrentRow.HeaderCell.Size.Width; 
    int columnsWidthSum = 0; 

    for (int i = dgv.CurrentCell.ColumnIndex; i >= 0; i--) 
    { 
     columnsWidthSum += dgv.Columns[i].Width; 

     if (dispWidth >= columnsWidthSum || dispWidth >= dgv.Columns[i].Width) 
     { 
      dgv.FirstDisplayedScrollingColumnIndex = i; 
      break; 
     } 
    } 
} 
+0

спасибо, он работает, но довольно раздражает, чтобы щелкнуть по ячейке посередине и перейти к началу сетки. Я хочу знать, почему это происходит? – Shin

+0

Я добавил строку, чтобы исправить проблему щелчком. – user3093781

-1

Спасибо пользователю3093781 очень за ваш ответ. Я основывал свой ответ на твоем.

Этот код работал для меня.

 private void dataGridView_CurrentCellChanged(object sender, EventArgs e) { 

     if (Control.MouseButtons.HasFlag(MouseButtons.Left)) 
      return; 

     DataGridView dgv = (DataGridView)sender; 

     if (dgv.CurrentCell == null || dgv.Columns.Count == 0) 
      return; 

     dgv.FirstDisplayedScrollingColumnIndex = 
      dgv.FirstDisplayedScrollingColumnIndex > dgv.CurrentCell.ColumnIndex ? 
      dgv.CurrentCell.ColumnIndex : 
      dgv.FirstDisplayedScrollingColumnIndex 
      ; 
    } 
Смежные вопросы