Как получить текстовое поле из в сети ASP ретранслятора

#c# #asp.net

Вопрос:

У меня есть страница каталога товаров. Когда вы нажимаете на кнопку «Добавить товар», появляется страница с корзиной. На этой странице есть таблица с таблицей элементов внутри нее. Есть ли какой-либо способ получить значение из текстового поля, расположенного внутри этой таблички, и изменить значение в столбце Общая стоимость в таблице, нажав кнопку? Основная проблема в том, что я не могу получить доступ к текстовому полю, так как оно находится в . Спасибо.

Страница каталога:

введите описание изображения здесь

Страница корзины:

введите описание изображения здесь

CartView.aspx

 
MasterPageFile="~/Page/Store.Master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="bodyContent" runat="server">
    <div id="content" style="margin-left: 7%;">
         <style>
             @import url("/css/tableCart.css");
             @import url("/css/ButtonsCart.css");
            
             </style>
        <h2 style="padding: 14px; color:Highlight;">Ваша корзина</h2>
        <h3 style="padding: 14px; color:Highlight;">Товары, которые вы добавили в корзину, представлены здесь</h3>
       
        <table id="Table1" V class ="simple-little-table">
            <thead>
                <tr>
                    <th></th>
                   <th>Название</th>
                   <th>Цвет</th>      
                  <th>Глубина</th>
                  <th>Ширина</th>
                     <th>Цена</th>
                   <th>Количество</th>
                        <th>Итого</th>
                    <th></th>
                </tr>
            </thead>
            <tbody>
                <asp:Repeater ID="Repeater1"  ItemType="Line.Models.CartLine"
                    SelectMethod="GetCartLines" runat="server" EnableViewState="false">
                    <ItemTemplate>
                        <tr>
                            <td><asp:Image ID="Image1" runat="server"  style="height:45px; " ImageUrl=<%# Item.Product.Img %> /></td>
                          <td> <%# Item.Product.NameProduct %> <%# Item.Product.TypeProducts %></td>
                           <td><%# Item.Product.Colors %></td>
                           <td>
                     Qty: <asp:TextBox ID="txtQty" runat="server"  Width="130px" />

                                    <asp:Button ID="cmdUpdate" OnClick="cmdUpdate_Click1" runat="server" Text="Update"  CommandName="MyUpdate" CommandArgument = '<%# Container.ItemIndex %>'/>
                           </td>
                            <td><%# Item.Size.Depth%></td>
                            <td><%# Item.Product.Price%></td>                        
                           </td>
                            <td>   
                            <td>
                                <asp:Label ID="Label2" runat="server" Text="<%# ((Item.Quantity * 
                                Item.Product.Price))%>"></asp:Label>
                                </td>
                            
                            <td>
                                <asp:Label ID="txtAmount" runat="server" Text=""></asp:Label>
                                 </td>
                            </tr>
                        </ItemTemplate>
                </asp:Repeater>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="3">Итого:</td>
                    <td colspan="2" ><%= CartTotal.ToString("c") %></td>                    
                </tr>
            </tfoot>
        </table>
    </div>
</asp:Content>
 

CartView.aspx.cs

 using Line.Helpers;
using Line.Models;
using Line.Models.Repository;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Routing;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Line.Page
{
   public partial class CartView : System.Web.UI.Page
   {

       protected void Page_Load(object sender, RepeaterCommandEventArgs e)
       {
           

       }



       public IEnumerable<CartLine> GetCartLines()
       {
           return SessionHelper.GetCart(Session).Lines;
       }
       public decimal CartTotal
       {

           get
           {
               return SessionHelper.GetCart(Session).ComputeTotalValue();
           }
       }

       public string CheckoutUrl
       {
           get
           {
               return RouteTable.Routes.GetVirtualPath(null, "checkout",
                   null).VirtualPath;
           }
       }
       public string ReturnUrl
       {
           get
           {
               return SessionHelper.Get<string>(Session, SessionKey.RETURN_URL);
           }
       }

   
       protected void cmdUpdate_Click1(object sender, RepeaterCommandEventArgs e)
       {

           if (e.CommandName == "MyUpdate")
           {
               RepeaterItem rRow = Repeater1.Items[Convert.ToInt32(e.CommandArgument)];

               TextBox tQty = (TextBox)rRow.FindControl("txtQty");

               Label tAmount = (Label)rRow.FindControl("txtAmount");

               tAmount.Text = tQty.Text;
           }

       }
   }
}

 

Ответ №1:

Хорошо, вы можете установить индекс кнопки и выбрать его в повторителе «команда элемента».

Итак, для вашей кнопки вы можете/хотите сказать следующее:

У меня есть количество, цена и сумма в ретрансляторе. и пуговицу.

Итак, разметка может выглядеть следующим образом:

 Qty: <asp:TextBox ID="txtQty" runat="server"  Width="130px" />
<br />
Price: <asp:TextBox ID="txtPrice" runat="server"  Width="130px" />
<br />
Amount: <asp:TextBox ID="txtAmount" runat="server"  Width="130px" />
<br />
<asp:Button ID="cmdUpdate" runat="server" Text="Update" 
      CommandName="MyUpdate" 
      CommandArgument = '<%# Container.ItemIndex %>'/>
 

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

У меня есть это:

введите описание изображения здесь

Теперь мой ретранслятор пересекается — и я думаю, что вам следует использовать listview, так как он лучше поддерживает сетку столбчатый макет, — но на самом деле это не имеет значения (listview, gridview, ретранслятор — все они работают одинаково).

Итак, обратите внимание, что в нашей кнопке у нас есть как имя команды, так и аргумент команды. В аргументе команды я передаю строку повторителя.

Итак, код выглядит следующим образом:

 protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{

// update button in repeater clicked

// update amount based on qty, and price

if (e.CommandName == "MyUpdate")
{
    RepeaterItem rRow = Repeater1.Items(e.CommandArgument);

    TextBox tQty = rRow.FindControl("txtQty");
    TextBox tPrice = rRow.FindControl("txtPrice");
    TextBox tAmount = rRow.FindControl("txtAmount");

    tAmount.Text = tQty.Text * tPrice.Text;
}
}
 

Итак, просто передайте «индекс» строки повторителя, как указано выше. Мы использовали это выражение в качестве аргумента команды:

 <asp:Button ID="cmdUpdate" runat="server" Text="Update" 
      CommandName="MyUpdate" 
      CommandArgument = '<%# Container.ItemIndex %>'/>
 

Итак, как только у вас будет индекс элемента (индекс строки), вы можете запустить код для одной строки и изменить эту строку, как указано выше.

Редактировать:

Итак, полная разметка, которая у меня есть, такова:

 <asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <div style="border-style:solid;color:black;width:250px;float:left">
        <div style="padding:5px;text-align:right">
            Hotel Name: <asp:TextBox ID="txtHotelName" runat="server" Text ='<%# Eval("HotelName") %>' Width="130px" />
            <br />
            First Name: <asp:TextBox ID="txtFirst" runat="server" Text ='<%# Eval("FirstName") %>'  Width="130px" />
            <br />
            Last Name: <asp:TextBox ID="txtLast" runat="server" Text ='<%# Eval("LastName") %>'  Width="130px" />
            <br />
            Qty: <asp:TextBox ID="txtQty" runat="server"  Width="130px" />
            <br />
            Price: <asp:TextBox ID="txtPrice" runat="server"  Width="130px" />
            <br />
            Amount: <asp:TextBox ID="txtAmount" runat="server"  Width="130px" />
            <br />
            
            <asp:Button ID="cmdUpdate" runat="server" Text="Update" CommandName="MyUpdate" CommandArgument = '<%# Container.ItemIndex %>'   />

            <div>
            City : <asp:DropDownList ID="cboCity" runat="server" DataTextField="City" 
                DataValueField="City" Width="110px">
                </asp:DropDownList>
                <div style="float:right;text-align:center;margin-left:4px;">
                <asp:Button ID="cmdAddCity" runat="server" Text=" " OnClick="cmdAddCity_Click" Height="16px" Width="12px" Font-Size="XX-Small" cssclass="btnPad" OnClientClick="AddCity();return false"/>
                </div>
            </div>
            Active: <asp:CheckBox ID="chkActive" runat="server" Checked = '<%# Eval("Active") %>'/>


        </div>
    </div>
    </ItemTemplate>
</asp:Repeater>
 

Код для загрузки этого ретранслятора следующий:

 protected void Page_Load(object sender, System.EventArgs e)
{
    if (IsPostBack == false)
        LoadGrid();
}


public void LoadGrid()
{
        cmdSQL.Connection.Open();
    strSQL = "SELECT ID, FirstName, LastName, HotelName, City, Active from tblHotels ORDER BY HotelName";
    using (SqlCommand cmdSQL = new SqlCommand(strSQL, new SqlConnection(My.Settings.TEST3)))
    {
        cmdSQL.Connection.Open();
        rstTable.Load(cmdSQL.ExecuteReader);

        Repeater1.DataSource = rstTable;
        Repeater1.DataBind();
    }
}
 

таким образом, вышесказанное заполняет повторитель — как уже отмечалось, для сетки, подобной макету, я бы использовал представление списка. Перетащите представление списка на веб — страницу.

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

Ваш код для загрузки сетки — такой же, как и выше.

теперь вместо ретранслятора, как на предыдущих снимках экрана?

Ты понимаешь это:

введите описание изображения здесь

Итак, ваши многочисленные линии, которые вы строите? Они должны основываться на представлении списка и вокруг него. И каждая строка, таким образом, может быть схвачена и адресована точно так же, как я сделал выше.

Поищите в Google примеры listview — там около миллиарда примеров.

Как только вы настроите эту настройку, каждая строка будет «вещью», которая автоматически повторяется для вас на основе данных из таблицы.

Разметка для представления списка — она опять же во многом соответствует тем же идеям и концепциям, что и повторитель. представление списка для приведенного выше выглядит следующим образом:

     <asp:ListView ID="ListView1" runat="server" DataKeyNames="ID">
        <ItemTemplate>
            <tr style="">
                <td><asp:Label ID="IDLabel" runat="server" Text='<%# Eval("ID") %>' /></td>
                <td><asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' /></td>
                <td><asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>' /></td>
                <td><asp:Label ID="HotelNameLabel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
                <td><asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' /></td>
                <td><asp:CheckBox ID="ActiveCheckBox" runat="server" Checked='<%# Eval("Active") %>' Enabled="false" /></td>
            </tr>
        </ItemTemplate>
        <LayoutTemplate>
            <table runat="server">
                <tr runat="server">
                    <td runat="server">
                        <table id="itemPlaceholderContainer" runat="server" border="0" style="">
                            <tr runat="server" style="">
                                <th runat="server">ID</th>
                                <th runat="server">FirstName</th>
                                <th runat="server">LastName</th>
                                <th runat="server">HotelName</th>
                                <th runat="server">City</th>
                                <th runat="server">Active</th>
                            </tr>
                            <tr id="itemPlaceholder" runat="server">
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr runat="server">
                    <td runat="server" style=""></td>
                </tr>
            </table>
        </LayoutTemplate>
    </asp:ListView>
 

Комментарии:

1. Большое вам спасибо за ваш ответ. Но не могли бы вы сказать мне, пожалуйста, как вы используете ретранслятор1. Элементы() как метод? VS говорит мне, что его можно использовать только как свойство.

2. элементы — это свойство-это набор строк — docs.microsoft.com/en-us/dotnet/api/…

3. Кроме того, неясно, почему у вас отключено состояние просмотра — вам нужно, чтобы оно было включено, чтобы значения сохранялись в повторителе. И этот тег «</форма>» также выглядит неправильно. Возможно, вам придется опубликовать больше этой разметки, поскольку то, что у вас есть, совсем не похоже на рабочую разметку.

4. Я новичок в программировании, так что простите меня за ряд глупых вопросов. Я включил состояние просмотра и изменил код, как вы показали выше, но когда я нажимаю кнопку, ничего не происходит, и значения из текстовых полей просто стираются. Я понял, что это как-то связано с методом OnClick. Этот метод не выполняется при нажатии кнопки, несмотря на свойство Click. У вас нет никаких идей, почему это происходит? Заранее большое спасибо.

5. Вы должны начать задавать новые вопросы — разбейте это на более мелкие проблемы и вопросы. Однако я опубликовал редактировать выше, как будет работать представление списка. Вам нужно, чтобы работал базовый макет и представление списка. Как только у вас это будет, вы перейдете к примеру кода о том, как я схватил строку и сослался на нее.