GridView Dynamic ItemTemplate EditIndex после фильтрации - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть динамически генерируемая сетка с пользовательским источником данных.

Вид сетки позволяет «редактировать, вставлять и удалять»

Все (все функции) работают нормально ..

Затем я добавил функцию фильтрации в сетку.

Допустим, ранее мой источник данных основывался на этом утверждении 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;

Индекс редактирования не будет правильно инициализирован. Например:

  1. До фильтра это был индекс № 8

  2. После фильтра это индекс № 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) ..

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

Событие обновления строки на странице cs:

protected void Grid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
   TextBox txtId = (TextBox)Grid.Rows[e.RowIndex].FindControl("txtId_insql");
   //Get the Id for which row is clicked
}

На странице aspx:

<Gridview>
<column>
 <asp:BoundColumn DataField="txtId_insql" HeaderText="PrimaryID" Visible="False"></asp:BoundColumn> 
</columns>
</GridView>

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

0 голосов
/ 22 декабря 2011

Не обновляйте данные на основе индекса сетки, просто найдите ключ (например, первичный ключ) на основе этого индекса, а затем обновите данные на основе этого ключа и снова свяжите вашу сетку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...