2011-01-25 58 views
0

布宜諾斯喬納斯,簡單來說,我的問題是:是否有可能允許用戶在運行時添加新項目到組合框,而不必將autopostback屬性設置爲true?我知道如果添加一個新項目,它需要回發,但如果用戶只是選擇了一個不同的值,我不希望該框回發!AJAX組合框添加新項目沒有autopostback =「真」

我現在有的標籤在下面。沒有autopostback="true",comboxbox不允許用戶將新項目添加到框中_ _ <'有什麼想法?

<ajx:ComboBox ID="cbCompany" runat="server" Width="226px" DropDownStyle="DropDown" 
    OnItemInserted="addCompany" AutoCompleteMode="SuggestAppend"> 
</ajx:ComboBox> 

我知道我可以添加更多的控制,做一個簡單的解決辦法,只是想知道是否有可能做這種方式。

回答

1

對於設計良好的組件,每次更改都不需要往返服務器,客戶端應該能夠處理大多數情況,除非服務器必須必須立即驗證數據。

所有事情的反模式都需要回發或使用.NET的懶惰版本的ajax(當服務器處理像比如向項目組合添加項目這樣的微小比特)時,JavaScript並不是很好,做那些簡單的任務。

我下載了ajaxcontroltoolkit的組合框的源代碼,不幸的是我沒有提供一個好的JavaScript界面​​。

你可以嘗試禁用回傳,並使用類似:

<script type="text/javascript"> 
function addItemToDumbComboBox(cb, text) 
{ 
     /* Based upon Combobox.pre method initializeOptionList() */ 

     // create the new list item 
     var child = document.createElement('li'); 
     child.innerHTML = text; 
     cb.get_optionListControl().appendChild(liItem); 

     // add the item to the internal collection 
     var item = { text: text.trim(); }; 
     Array.add(cb._optionListItems, item); 

     // style the ListItem with default skin 
     cb.initializeOptionListItem(child); 
} 

addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #1"); 
addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #2"); 
addItemToDumbComboBox(document.getElementById("cbCompany"), "new item #3"); 
</script> 

...看看會發生什麼。注意我沒有真正測試這個代碼,這只是一個例子。

順便說一句,我建議你切換到一個合適的JavaScript接口的組合框實現。

讓服務器做好所有工作就像是買烤麪包機和每份早餐郵寄給工廠,連同2片面包,讓他們做烘烤,並將其送回給您,祝酒!這是愚蠢的,但不要責怪自己,這是一個常見的ASP.NET反模式。

希望有幫助,上帝保佑!

+0

我試圖保持我的問題簡短,抱歉的缺乏信息。但我需要它回發到服務器。該組合最初由來自數據庫的公司名稱填充。但是,如果用戶的公司沒有列出,他們可以在框中輸入一個新的觸發我的「OnItemInserted」事件,該事件將項目添加到數據庫並重新加載組合框。我不希望它在用戶選擇不同的預先存在的值時回發。說他們首先去頁面,選擇一個已經存在的值,它會回發:( –

+0

好吧,廢話,也許我可以按照你的方式做,但添加一個__doPostBack()!Imma試試吧.. –

+0

I看到了,我錯過了OnItemInserted事件。讓我們看看我是否可以有任何幫助... =) – Trinidad

0

爲組合框禁用autopostback並嘗試在您的頁面末尾放置類似folling代碼的內容。

<script type="text/javascript"> 
function subclassComboBox(cb) 
{ 
    cb._old__onTextBoxBlur = cb._onTextBoxBlur; 
    cb._onTextBoxBlur = function(e) { 
     var saveAutoPostBack = cb.get_autoPostBack(); 
     cb.set_autoPostBack(false); 

     cb._old_textBoxBlurHandler(e); 

     if (cb.get_selectedIndex() == -2) { 
      /* -2 means that a custom value was typed. only in this case do postback */ 
      cb._doingPostBack = true; 
      __doPostBack(cb.get_element().id, ''); 
     } 

     cb.set_autoPostBack(saveAutoPostBack); 
    }; 
    cb._old_textBoxBlurHandler = cb._textBoxBlurHandler; 
    cb._textBoxBlurHandler = Function.createDelegate(cb, cb._onTextBoxBlur); 

    $clearHandlers(cb.get_textBoxControl()); 
    $addHandlers(cb.get_textBoxControl(), 
    { 
     "click": cb._textBoxClickHandler, 
     "focus": cb._textBoxFocusHandler, 
     "blur": cb._textBoxBlurHandler, 
     "keypress": cb._textBoxKeyPressHandler 
    }, cb); 
} 

subclassComboBox(document.getElementById("cbCompany")); 
</script> 

我還沒有測試此代碼,但這個想法是使組合只能做回發進入了一個新的值時(即使自動回是假的)。如果這個工作,你將不再需要那個按鈕;)