我正在尝试使用gridview的更新方法,只是返回null
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
TextBox Currency = ((TextBox)GridView1.Rows[e.RowIndex].FindControl("Currency"));
GridView1.EditIndex = -1;
if (!Page.IsPostBack)
{
FillTravelers();
}
}
有什么想法吗?当我按下更新时,它只返回该字段为其先前的值,但不返回任何内容。
由于
答案 0 :(得分:1)
我不确定你是否分享了足够的细节,但我最初的想法是,如果你的“更新”涉及按下按钮(因此,回发) - 你的填充程序将不会被解雇,因为! .IsPostback将是假的。
我假设你的方法“FillTravelers”在你点击Update时有处理过滤的余地。
答案 1 :(得分:1)
由于您的Gridview是最简单的形式,并且在gridview中没有定义控件(因此GridView中没有定义Currency文本框),请检查我认为是Datatable的GridView1的数据源。 然后,您需要确定Datatable的哪一列是Currency列。
例如,对于下面的数据表,它将是第2列。
DataTable taskTable = new DataTable("AmountList");
taskTable.Columns.Add("Id", typeof(int));
taskTable.Columns.Add("Currency", typeof(string));
taskTable.Columns.Add("Amount", typeof(decimal));
基于此,您可以使用以下代码检索更新的货币值。
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow row = TaskGridView.Rows[e.RowIndex];
GridView1.EditIndex = -1;
TextBox txtCurrency = (TextBox)(row.Cells[2].Controls[0]);
if (!Page.IsPostBack)
{
FillTravelers();
}
//... Rest of the code
}
请注意,如果上面的Currency列不同,那么您需要更改rows.Cells [index] .Controls [0]的索引。例如,如果Currency在第5列,则txtCurrency定义变为:
TextBox txtCurrency = (TextBox)(row.Cells[5].Controls[0]);
如果您无法轻易找出数据表的列索引(或者如果您使用的是更复杂的数据源),那么,假设GridView1没有太多列,我建议尝试增加单元格逐步索引,直到在调试时看到Watch for row.Cells [index] .Controls [0]中的更新值。
编辑:(添加代码以检索Currency列的列索引) 您可以将“Currency”作为字符串传递,将OracleDataReader实例传递给下面的方法,这应该为您提供列索引(如果OracleDataReader中没有Currency列,则它会给出-1)。
private int GetColumnIndexIfExists(OracleDataReader dr, string columnName)
{
for (int i = 0; i < dr.FieldCount; i++)
{
if (dr.GetName(i).Equals(columnName))
{
return i;
}
}
return -1;
}
然后在实际代码中,您可以修改单元索引的add 1,如下所示,因为单元格索引不像列索引那样基于零。
TextBox txtCurrency = (TextBox)(row.Cells[i+1].Controls[0]);
答案 2 :(得分:0)
FindControl()
方法导致您获得null,因为没有任何名为TextBox
的{{1}}控件。试试这个,
Currency