2013-07-26 43 views
0

我有兩個asp:標籤,其中第一個用幾個按鈕代替,第二個用一列項目。在頁面加載時觸發的方法,但不是通過asp按鈕

我想單擊按鈕來過濾項目。

按鈕的內容是通過用html替換文本以編程方式添加的,並且工作正常。

ASP:

<form id="form1" runat="server"> 
    <asp:Label id="filters" runat="server" Text="Filters here"/> 
    <asp:Label id="itemList" runat="server" Text="List of items here"/> 
</form> 

過濾器標籤的結果HTML:

<input type="submit" onclientclick="Load_Items(0)" runat="server" value="First"/> 
<input type="submit" onclientclick="Load_Items(1)" runat="server" value="Second"/> 
<input type="submit" onclientclick="Load_Items(2)" runat="server" value="Third"/> 

相關的C#:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
    Load_Items(0); 
    } 
} 
public void Load_Items(int filterType) 
{ 
    //code to load items (pseudo below) 
    for each row in list 
    if filterType = itemType 
     build string 
    replace second label with string 
} 

在頁面加載發生的一切,就像我希望它與內容被第一項過濾(因此Load_Items(0)),如果我手動將0更改爲在Page_Load中的其他數字,它會按其他類型進行過濾,但如果我單擊以編程方式添加的按鈕,除了看起來像頁面刷新的情況,什麼都不會發生。

我知道回發檢查工作是通過在它之前和之內添加一個文本替換。

我還添加了一個asp:按鈕,以確保它不是做的按鈕添加如下的方式(與搜索推薦一些額外的東西):

<asp:Button runat="server" CausesValidation="False" onclientclick="Load_Items(2); return false;" text="Submit" /> 

但是,是什麼是問題嗎?

+2

我沒有看到你創建的按鈕觸發Load_Items()。該如何工作? –

+0

@KaiHartmann - 我的壞,複製粘貼錯誤。 – dudledok

+3

這是行不通的,因爲你的按鈕只是在客戶端調用一個方法,而不是服務器端的方法。 –

回答

2

OnClientClick property指定在按鈕被單擊時在瀏覽器中運行的JavaScript。由於您可能沒有一個名爲Load_Items的JavaScript函數,因此會生成腳本錯誤,然後按鈕將導致表單回傳。

服務器端Click event將在服務器上觸發,但不允許您傳遞參數。您只會獲得按鈕實例和一個空的EventArgs實例。

你可能會更好使用Command event,加上CommandArgument property

<asp:Button runat="server" CommandArgument="2" OnCommand="Load_Items" ... 

事件處理程序將使用CommandEventArgsCommandArgument財產從點擊按鈕訪問參數:

protected void Load_Items(object sender, CommandEventArgs e) 
{ 
    Load_Items(Convert.ToInt32(e.CommandArgument)); 
} 
+0

我知道我不應該使用OnClientClick,但是當我一次搜索那麼多東西時,我就失去了蹤跡。之前沒有使用過OnCommand。就像現在的魅力一樣。謝謝。 – dudledok

1

好,這是我認爲每一個asp.net開發涉及一些常見的問題時間。它的共同部分,即asp.net事件系統不起作用,如windows窗體。 Page對象以及該頁面上的所有控件都有lifecycle events,這些對象在任何請求期間都會觸發,即使它來自更新面板。 當您通過代碼創建這些控件時,您必須記住,這些控件的所有事件都應該作爲Page對象的一部分工作。這就是爲什麼你必須在觸發所有其他控件的事件之前在Page_Init事件中創建這些對象。 請注意,您必須將這些控件創建爲asp。網絡對象:

var btn = new Button(); 

但不是簡單地添加html標記。而且你必須在每次請求時重新創建它們,然後創建它們。

請看看我的另一個answer

+0

那麼過濾與硬編碼按鈕一起工作,但不像編程式HTML那樣。我將不得不考慮如何創建按鈕。 – dudledok

相關問題