Событие Gridview не стреляет - PullRequest
0 голосов
/ 29 марта 2012

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

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

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

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

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

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

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

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

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

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

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

EDIT

Чтобы избежать дублирования усилий, используя вышеупомянутый подход, вы можете найти индекс строки, используя технику, которую Панкадж Гарг обрисовал в своем ответе:

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
        } 
    }    
}
1 голос
/ 29 марта 2012

Вы можете проверить индекс текущей строки, как показано ниже ...

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

Создайте обработчик для события OnTextChanged и установите AutoPostBack Property True.

protected void TextBox_TextChanged(object sender, EventArgs e)
{
     int CurrentGridIndex = ((GridViewRow)((TextBox)sender).NamingContainer).RowIndex
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...