2014-11-24 3 views
1

Использование приложения Windows Forms.
У меня этот класс, полученный из DataGridView управления:Как удалить последний DataGridViewRow при вставке нового в начале?

public class CustomDataGridView : DataGridView 
{ 
    private int maxRowsAllowed = 3; 

    public CustomDataGridView() 
    { 
     this.AutoGenerateColumns = false; 
     this.AllowUserToAddRows = false; 
     this.AllowUserToDeleteRows = false; 
     this.ReadOnly = true; 
     this.RowsAdded += CustomDataGridView_RowsAdded; 
     this.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
    } 

    public void Start() 
    { 
     this.Columns.Add("col1", "header1"); 
     this.Columns.Add("col2", "header2"); 

     // rows added manually, no DataSource 
     this.Rows.Add(maxRowsAllowed); 
    } 

    private void customDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
    { 
     // At this point, while debugging, I realized that CurrentRow is null, 
     // doing impossible to change it to a previous one, this way avoiding an exception. 
     if (this.Rows.Count > maxRowsAllowed) 
     { 
      this.Rows.RemoveAt(maxRowsAllowed); 
     } 
    } 
} 

Затем из класса контейнера, внутри AddRowAtBeginning метода, новая строка вставляется при 0 индекса, перемещение одного индекса вниз других.
Когда RowsAdded событие поднято, и только, если фактический итоговый счетчик строк больше последний удаляется.

public class ContainerForm : Form 
{ 
    private CustomDataGridView dgv; 

    public ContainerForm() 
    { 
     InitializeComponent(); 

     dgv = new CustomDataGridView(); 

     dgv.Size = new Size(400, 200); 
     dgv.Location = new Point(10, 10); 
     this.Controls.Add(dgv); 

     dgv.Start(); 
    } 

    // Inserts a row at 0 index 
    private void aButton_Click(object sender, EventArgs e) 
    { 
     var newRow = new DataGridViewRow(); 
     newRow.DefaultCellStyle.BackColor = Color.LightYellow; 

     dgv.Rows.Insert(0, newRow); 
    } 
} 

Все в порядке, пока CurrentRow (с маленькой стрелкой на заголовке), из-за смещения, не выбрана быть удалены.

Я думаю, что причина System.ArgumentOutOfRangeException бросается, когда RowsAdded ускользает, попробуйте вернуться к dgv.Rows.Insert(0, newRow) линия.

Я пока не нашел решения.

+0

в то время как легко обойти эту проблему, я не знаю причину этого; Одним из исправлений является перемещение кода 'customDataGridView_RowsAdded' в конец метода' aButton_Click', вставка которого происходит после 'dgv.Rows.Insert (0, newRow);'. – kennyzx

+0

Несомненно, ваше предложение верное, но в этом случае «ContainerForm» должен знать значение «maxRowsAllowed», чего я пытаюсь избежать. – Shin

ответ

0

пытаются изменить

if (this.Rows.Count > maxRowsAllowed) 
{ 
    this.Rows.RemoveAt(maxRowsAllowed); 
} 

к этому

if (this.Rows.Count > maxRowsAllowed) 
{ 
    // if the number of rows is 10 
    // the index of the last item is 9 
    // index 10 is out of range 
    this.Rows.RemoveAt(maxRowsAllowed -1); 
} 
+0

Нет, это не является причиной проблемы. Если значение Row.Count больше 10 (maxRowsAllowed), то datagridview должен иметь не менее 11 строк, 'this.Rows.RemoveAt (10)' не будет вызывать аргумент outofrangeexception. – kennyzx