2012-03-29 99 views
0

我有一個要求,在那裏我有更新一個文本框,如果有的話,我網格視圖改變的價值。我有2排一個GridView ..GridView的事件不觸發

一個與標籤模板場一個文本框另一個模板場...

我網格視圖看起來像

    name     value 
        a      (empty textbox) 
        b      (empty textbox) 
        c      (empty textbox) 

現在,當用戶輸入在格蘭文本框中應該自動更新鏈接到該文本框的另一個值。

在這裏我的問題是,當有人在文本框中輸入一個值時應該觸發一個事件!

(我從數據庫中得到名字a,b,c)。我不想要編輯鏈接或更新鏈接,因爲所有要輸入的值都是強制性的!

我試過Grid_SelectedIndexChanged1,但這不是射擊..有東西我失蹤或我需要改變,所以前衛被解僱,我可以更新其他文本?

我是ASP.NET新手,請大家幫忙!

在此先感謝!

+2

文本框有一個AutoPostBack屬性其設置爲true,並處理TextChanged事件或用JavaScript做它在客戶方。 – 2012-03-29 18:07:24

+0

請通過鏈接文本框告訴我你的意思嗎? – 2012-03-29 18:08:07

+0

我也試過,但是如何知道哪些行文本框發生了變化? – helpme 2012-03-29 18:08:26

回答

1

你可以檢查下面的當前行索引...

((GridViewRow)((TextBox)sender).NamingContainer).RowIndex 

創建OnTextChanged事件的處理程序,並設置AutoPostBack Property True

protected void TextBox_TextChanged(object sender, EventArgs e) 
{ 
    int CurrentGridIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex 
} 
+0

@ pankaj ...我試圖做到這一點,並試圖訪問該單元格它返回一個空字符串! – helpme 2012-03-29 18:54:09

+0

我做了一些像GridViewRow gv = Grid.Rows [CurrentGridIndex]; string value = gv.Cells [0] .Text; – helpme 2012-03-29 18:54:16

+1

你可以在你的單元格內找到控件,例如'(ControlType)gv.FindControl(「YourID」)' – Pankaj 2012-03-29 18:58:16

2

如果更新應該在文本更改時觸發,則應使用TextBoxOnTextChanged事件並將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 
     } 
    }  
} 
+0

如果GridView在UpdatePanel中(只是猜測),他還需要爲GridView的RowCommand添加一個觸發器。 – 2012-03-29 18:12:50

+0

@謝謝你的回覆,問題是我知道我現在有哪個文本框的值..例如我必須知道.. a =輸入值的值! – helpme 2012-03-29 18:14:19

+0

我不確定你的意思。你是說你需要知道'TextBox'對應哪一行? – 2012-03-29 18:18:21