如果更新應該在文本更改時觸發,則應使用TextBox
的OnTextChanged
事件並將AutoPostBack
設置爲true。
編輯
爲了避免在這裏重複工作,使用上述方法,您可以使用潘卡加爾格在他的回答中列出的技術找到行索引:
int rowIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex;
最大的告誡這種方法是它不能原諒標記的變化。如果您要將TextBox
包裝在另一個實施了INamingContainer
的控件中,則上面的示例會中斷。例如:
<asp:TemplateField>
<asp:Panel ID="Panel1" runat="server"> <!-- becomes the naming container -->
<asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' />
</asp:Panel>
</asp:TemplateField>
這就是說,你會想相應地標記你的標記,所以其他開發人員在修改時要小心。
編輯
作爲替代方案,你也可以使用onchange
事件TextBox
的觸發JavaScript的回傳:
<script type="text/javascript">
valueChanged = function(rowIndex){
__doPostBack("<%= GridView1.ClientID %>", rowIndex);
}
</script>
<asp:GridView ID="GridView1" runat="server" DataKeyNames="ID" ...>
<Columns>
<asp:TemplateField>
<asp:TextBox ID="TextBox1" runat="server" onchange='valueChanged(<%# Container.ItemIndex %>);' />
</asp:TemplateField>
</Columns>
</asp:GridView>
在後臺代碼,重寫RaisePostBackEvent
法,把你的更新邏輯放在那裏:
protected override void RaisePostBackEvent(IPostBackEventHandler source, string eventArgument)
{
base.RaisePostBackEvent(source, eventArgument);
if (source == GridView1)
{
int rowIndex = int.Parse(eventArgument);
TextBox txt = GridView1.Rows[rowIndex].FindControl("TextBox1") as TextBox;
if (txt != null)
{
var id = (int)GridView1.DataKeys[rowIndex]["ID"];
var text = txt.Text.Trim();
//update the database
}
}
}
文本框有一個AutoPostBack屬性其設置爲true,並處理TextChanged事件或用JavaScript做它在客戶方。 – 2012-03-29 18:07:24
請通過鏈接文本框告訴我你的意思嗎? – 2012-03-29 18:08:07
我也試過,但是如何知道哪些行文本框發生了變化? – helpme 2012-03-29 18:08:26