2017-10-17 49 views
2

介紹如何訪問特定控制在ASP.Net直放站

我在大學項目,我需要建立一個購物網站的工作。

我目前正在建設一個「管理購物車」頁面的結構如下: enter image description here

什麼是我的問題重要的是「產品」。 「產品」是僅使用ItemTemplate控件的ASP.Net轉發器。然後中繼器在用戶的購物車中填充產品列表。

我的問題是什麼?

我遇到的特定區域是「保存」按鈕。 用戶可以更改他們想要的每種產品的數量;但是,他們必須單擊「保存」按鈕才能將信息發送到數據庫。

問題是我的保存按鈕的onclick事件中訪問正確的數量文本框。

如何在我的所有保存按鈕的OnClick事件中訪問正確的文本框?

我試過了什麼?

我最初是想用WebControl.FindControl方法。 當然,FindControl需要一個ID,我需要爲每個文本框使用不同的ID。

爲了這個ID的問題,我試圖修復...

首先...

試圖結合產品ID的文本框的ID。

<asp:TextBox ID='quantity<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' /> 

然後我發現那是不可能的;因爲在以這種方式設置ID時,必須使用「簡單ID」(例如:「button1」)。據說我可以在代碼隱藏中設置ID。

其次...

然後我使用Repeater的OnItemCreated事件動態設置文本框 「QUANTITYX」,其中X是產品ID的ID嘗試。

我所做的是在產品ID綁定到一個WebControl的屬性:

<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' /> 

在此之後,我然後使用FindControl()方法來獲取與「量」的ID TextBoxs。找到文本框後,我將採用productId屬性並將其值附加到TextBox ID。

protected void productsList_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     TextBox quantity = (TextBox)e.Item.FindControl("quantity"); 
     quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]); 
    } 
} 

然後我發現productId屬性沒有值;因爲DataBinding沒有發生。換句話說,Eval("productId")未運行。

三...

我採取了同樣的方式作爲一個前用1個差異。我使用直放站的OnItemDataBound事件而不是OnItemCreated事件。

protected void productsList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     TextBox quantity = (TextBox)e.Item.FindControl("quantity"); 
     quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]); 
    } 
} 

這部分工作;但是,有一個問題。具有最大產品ID的產品被跳過。 (E.X,如果我有產品4,32和68.產品ID 68將被跳過)

正如您在下圖中看到的,我們有3種產品。我編輯了一些文字圖片來清楚地指出文本框(當它們被渲染時)。

存在的ID是1,32和34.如果您查看1和32的ID屬性,您會看到它們具有「數量」,並附有其產品ID。

現在看看34的ID屬性.ID屬性只是「數量」。

現在我有點卡住了。

enter image description here

我是什麼用?

  • 的Visual Studio 2017年
  • 的.NET Framework 4.6.1
  • 2層的WebForms項目
  • 谷歌瀏覽器
+0

使用ASP的控制,而不是簡單的HTML。 – AsifAli72090

+0

@Asif.Ali我正在使用ASP Controls ... OP中的最後一張圖片是chrome開發人員工具中呈現頁面的屏幕截圖。 – Tyler

+0

你的問題是保存按鈕點擊事件訪問文本框? – AsifAli72090

回答

1

要想從文本框的文本在您的保存按鈕點擊使用以下代碼:

// get item on where button is clicked 
RepeaterItem item = (RepeaterItem)((Button) sender).NamingContainer; 

// get correct textbox from the item 
TextBox txtQuantity = (TextBox)item.FindControl("quantity"); 

string qtyText = txtQuantity.Text; 

在你的第三個方法your're只檢查DataItems但你必須檢查它AlternatingItems也:

if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem) 
+0

正如我在我的OP中提到的,我有多個TextBoxs,我需要從中獲取文本。每個產品有1個數量的文本框。使用您提供的代碼只會得到第一個文本框。第二個產品的「保存」按鈕必須訪問第二個產品的「數量」,而不是第一個產品的「數量」,PS - 抱歉等待,班級再次開始。我只有在下一個時期開始前10分鐘。 – Tyler

+0

如果您的文本框是內置中繼器,那麼這將工作正常,因爲您需要多個文本框在中繼器。 – AsifAli72090

+0

哦...所以RepeaterItem基本上可以在幕後處理設置動態ID。它似乎工作得很好。謝謝! – Tyler