2012-03-29 6 views
0

У меня есть требование, где я должен обновить текстовое поле, если какой-либо из значения в моих изменениях в виде сетки .. У меня есть GridView с 2 рядами ..Gridview события не стрельбы

один шаблон поля с меткой и другой шаблон поле с текстовым полем ...

моего взгляд сетки выглядит

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

теперь, когда пользователь вводит значение в текстовом поле Дэ он должен автоматически обновлять другое текстовое поле, которое связанно с этим.

Здесь мои вопросы, когда кто-то вводит значение в текстовое поле, должно быть уволено событие!

(Я получаю имена a, b, c, из базы данных). Я не хочу иметь ссылку на редактирование или ссылку обновления, потому что все введенные значения являются обязательными!

Я попробовал Grid_SelectedIndexChanged1, но это не стреляло .. есть что-то, чего я не вижу, или мне нужно изменить, чтобы evant был уволен, и я могу обновить другое текстовое поле ??

Я новичок в ASP.NET, поэтому, пожалуйста, помогите!

Заранее благодарен!

+2

У объекта TextBox свойство AutoPostback установлено значение true и обрабатывает событие TextChanged или выполняет его на clientide с помощью javascript. –

+0

Не могли бы вы рассказать мне, что вы подразумеваете, связывая текстовые поля? –

+0

Я тоже это пробовал .. но как узнать, какие текстовые поля строк изменились? – helpme

ответ

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

+0

Я сделал что-то вроде GridViewRow gv = Grid.Rows [CurrentGridIndex]; Строковое значение = gv.Cells [0] .Text; – helpme

+1

Вы можете найти элементы управления внутри ваших ячеек типа '(ControlType) gv.FindControl (« YourID »)' – Pankaj

2

Если обновления должны быть инициированы при изменении текста, вы должны использовать событие OnTextChangedTextBox и установить для AutoPostBack значение true.

EDIT

Во избежание дублирования усилий здесь, с использованием вышеуказанного подхода вы можете найти индекс строки, используя метод, который Pankaj Garg, изложенный в его ответе:

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> 

Это, как говорится, вы хотели бы фиксировать разметку соответственно, чтобы другие разработчики знают, чтобы быть осторожным при внесении изменений.

EDIT

В качестве альтернативы, вы можете также вызвать постбэк в JavaScript, используя onchange событие TextBox:

<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 (просто гадать), ему также необходимо добавить триггер для RowCommand GridView. –

+0

@ спасибо за ответ, проблема в том, что я знаю, какое значение текстового поля у меня есть сейчас .. например, я должен знать .. значение a = введенное значение! – helpme

+0

Я не уверен, что вы имеете в виду. Вы говорите, что вам нужно знать, к какой строке соответствует TextBox? –