我有一个动态生成的带有自定义数据源的gridview。
gridview允许“编辑,插入和删除”
所有功能(所有功能)都运行良好..
然后我在gridview中添加了一个过滤功能..
我们之前说过我的数据源基于这个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;
editindex将无法正确初始化。例如:
在过滤之前它是索引号8
过滤后,它是索引号1
如果我在过滤器之后编辑这个gridview它会做什么是将1作为编辑索引(假设为8)...因此不会更新索引8上的数据..它将覆盖索引号为1的数据。
我希望我的问题很清楚......期待听到一些答案:)..
修改
这在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值)..
答案 0 :(得分:-1)
不要根据网格索引更新数据,只需找到基于该索引的密钥(如主键),然后根据该密钥更新数据并再次绑定网格。
答案 1 :(得分:-1)
在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>
因此您将获得ID。您可以立即使用Id进行更新。不使用索引。