Использование приложения 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)
линия.
Я пока не нашел решения.
в то время как легко обойти эту проблему, я не знаю причину этого; Одним из исправлений является перемещение кода 'customDataGridView_RowsAdded' в конец метода' aButton_Click', вставка которого происходит после 'dgv.Rows.Insert (0, newRow);'. – kennyzx
Несомненно, ваше предложение верное, но в этом случае «ContainerForm» должен знать значение «maxRowsAllowed», чего я пытаюсь избежать. – Shin