Получение значения текстового поля в TemplateField в представлении сетки

Я буду краток и прост. Я учусь на инженера-программиста в 12-м классе, и в качестве моего последнего проекта я решил сделать веб-сайт. О чем сайт, на самом деле не имеет значения. Проблема в следующем:

На прикрепленном изображении есть текстовое поле внутри поля шаблона внутри этого gridview. Мне нужно получить значение, которое пользователь пишет внутри. После того, как вы напишите значение, вы нажимаете «Купить». Я просмотрел похожие вопросы, и ни один из них не предложил рабочего решения. Что происходит, так это то, что значение просто исчезает. Я нахожу нужный элемент управления с помощью FindControl, но значение каким-то образом удаляется. Как я узнаю, что нахожусь в правильном контроле? Я перешел на сторону клиента и добавил в asp:TextBox следующее: Text="5" Это работает отлично, поэтому я знаю, что он попадает в нужный элемент управления, но что-то заставляет его исчезнуть. Мое представление сетки заполняется набором данных, состоящим из двух объединенных наборов данных, и я помещаю команду Merge, а DataSource и DataBind находятся в if (!this.IsPostBack). Я полностью потерялся и понятия не имею, что делать, помощь очень ценится.


person guy 111120    schedule 07.05.2017    source источник


Ответы (1)


Все элементы управления в GridView доступны при поиске правильной строки с помощью FindControl. Для этого вы можете отправить номер строки как CommandArgument и использовать его в коде позади. Итак, сначала начните с использования OnCommand вместо OnClick и установите CommandArgument на странице aspx.

<asp:TemplateField>
    <ItemTemplate>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

        <asp:Button ID="Button1" runat="server" Text="Purchase" OnCommand="Button1_Command" CommandArgument='<%# Container.DataItemIndex %>' />
    </ItemTemplate>
</asp:TemplateField>

А затем в коде позади

protected void Button1_Command(object sender, CommandEventArgs e)
{
    //get the rownumber from the command argument
    int rowIndex = Convert.ToInt32(e.CommandArgument);

    //find the textbox in the corrext row with findcontrol
    TextBox tb = GridView1.Rows[rowIndex].FindControl("TextBox1") as TextBox;

    //get the value from the textbox
    try
    {
        int numberOfTickets = Convert.ToInt32(tb.Text);
    }
    catch
    {
        //textbox is empty or not a number
    }
}
person VDWWD    schedule 08.05.2017