У меня есть динамически генерируемая сетка с пользовательским источником данных.
Вид сетки позволяет «редактировать, вставлять и удалять»
Все (все функции) работают нормально ..
Затем я добавил функцию фильтрации в сетку.
Допустим, ранее мой источник данных основывался на этом утверждении select:
SELECT * FROM <Table>
Теперь, после фильтра:
SELECT * FROM <Table> WHERE <Filter Condition>
После фильтрации .. Я не могу правильно редактировать (обновлять) gridview .. Как и в режиме редактирования ..
public void gvGridView_RowEditing(object sender, GridViewEditEventArgs e)
{
gvGridView.EditIndex = e.NewEditIndex;
((TemplateField)gvGridView.Columns[1]).EditItemTemplate = null;
//disable editing on primary key
if (txtSearch.Text != string.Empty || CountRow() > 0)
{
FilterQuery(); //refilter the gridview
}
else
{
gvGridView.DataBind();
//if gridview is not meant to be filtered, just leave it as it is
}
Session["SelecetdRowIndex"] = e.NewEditIndex;
}
Благодаря этой строке:
gvGridView.EditIndex = e.NewEditIndex;
Индекс редактирования не будет правильно инициализирован. Например:
До фильтра это был индекс № 8
После фильтра это индекс № 1
Если я отредактирую это сеточное представление после фильтра, то, что он будет делать, будет 1 в качестве индекса редактирования (предположительно, 8) ... следовательно, вместо обновления данных в индексе 8 ... он будет переопределять данные индексом 1 ... .
Надеюсь, мой вопрос достаточно ясен .. с нетерпением жду ответов:) ..
Edit:
Вот что происходит при обновлении gridview:
GridViewRow row = gvGridView.Rows[e.RowIndex];
//decide which row being edited..
for (int i = 0; i < Table.Columns.Count; i++)
{
string field_value = ((TextBox)row.FindControl(Table.Columns[i].ColumnName)).Text;
ParameterArray.Add(field_value);
//storing all value in that row into an array (including PK)
}
Приведенный выше код работает нормально (сохраните все значения в массиве), за исключением первичного ключа .. (всегда сохраняйте значение e.rowindex) ..