Для этого вы можете использовать подход в коде ниже. В показанном методе addRow
вставлена новая строка сетки. Логика заключается в том, что нам нужно повторно привязать сетку к новому источнику данных, который содержит исходные строки плюс новую пустую строку. Вы можете использовать подобный подход для удаления (создайте новый источник данных с удаленными строками, а затем переустановите сетку).
При удалении используйте метод deleteRow
. Я предположил, что у вас есть элемент флажка с идентификатором chkDelete
в строке сетки, который при проверке означает, что строка должна быть удалена. Вы можете удалить несколько строк одновременно, используя метод deleteRow
.
Если вы используете следующие два метода для добавления строки и удаления строк (строк), то автоматически ваши отредактированные текстовые поля будут иметь свои новые значения, всегда сохраненные, то есть editing would then be automatically taken care of
.
Предположения сделаны: Кроме того, я предположил, что в ячейке сетки есть 3 текстовых поля, а также флажок. Поскольку существует 3 текстовых поля, поэтому DataTable, созданный в методах ниже, должен содержать 3 столбца для этих 3 текстовых полей, и эти столбцы должны быть строкового типа.
Добавить Роу
protected void addRow()
{
DataTable dt = new DataTable();
//add code to create columns for this data table
//only create columns for textbox data
dt.Columns.Add("Column1", typeof(string));
dt.Columns.Add("Column2", typeof(string));
dt.Columns.Add("Column3", typeof(string));
DataRow dr = null;
//build a data source of existing rows
foreach (GridViewRow gridRow in grid1.Rows)
{
dr = dt.NewRow();
//set only text box values in new data source
//so checkbox column for row selection will be ignored
TextBox txtColumn1 = gridRow.FindControl("txtColumn1") as TextBox;
TextBox txtColumn2 = gridRow.FindControl("txtColumn2") as TextBox;
TextBox txtColumn3 = gridRow.FindControl("txtColumn3") as TextBox;
dr[0] = txtColumn1.Text;
dr[1] = txtColumn2.Text;
dr[2] = txtColumn3.Text;
dt.Rows.Add(dr);
}
//create the row in data sourec for the new grid row
dr = dt.NewRow();
dt.Rows.Add(dr);
//bind the grid view, which will now show you the new added row in addition to original rows
grd.DataSource = dt;
grd.DataBind();
}
Удалить строку (ы)
protected void deleteRow()
{
DataTable dt = new DataTable();
//add code to create column for this data table
//only set column for textbox columns
dt.Columns.Add("Column1", typeof(string));
dt.Columns.Add("Column2", typeof(string));
dt.Columns.Add("Column3", typeof(string));
//build a data source of existing rows
foreach (GridViewRow gridRow in grid1.Rows)
{
//get whether the checkbox for deleting row is checked or not
CheckBox chkDelete = gridRow.FindControl("chkDelete") as CheckBox;
//do not add original row if it was checked to be deleted
if(!chkDelete.Checked)
{
dr = dt.NewRow();
//set only text box values in new data source
//so checkbox column for row selection will be ignored
TextBox txtColumn1 = gridRow.FindControl("txtColumn1") as TextBox;
TextBox txtColumn2 = gridRow.FindControl("txtColumn2") as TextBox;
TextBox txtColumn3 = gridRow.FindControl("txtColumn3") as TextBox;
dr[0] = txtColumn1.Text;
dr[1] = txtColumn2.Text;
dr[2] = txtColumn3.Text;
dt.Rows.Add(dr);
}
}
//bind the grid view, which will now NOT have the deleted rows
grd.DataSource = dt;
grd.DataBind();
}
Как вы построить свой DataRow? можете ли вы показать больше кода? – lyz
Вы можете привязываться к 'DataTable' без базы данных. Я бы не рекомендовал напрямую манипулировать строками сетки, просто манипулировать данными, к которым он привязан. – Crowcoder