布宜诺斯艾利斯,简而言之,我的问题是:是否可以允许用户在运行时将新项目添加到组合框而不将autopostback属性设置为true?我知道如果添加了一个新项目,它需要回发,但如果用户只是选择一个不同的值,我不希望该框回发!
我目前拥有的标签如下。如果没有autopostback="true"
,则comboxbox不允许用户向框添加新项> _<'有什么想法吗?
<ajx:ComboBox ID="cbCompany" runat="server" Width="226px" DropDownStyle="DropDown"
OnItemInserted="addCompany" AutoCompleteMode="SuggestAppend">
</ajx:ComboBox>
我知道我可以添加一些控件并做一个简单的解决方法,只是想知道是否可以这样做。
答案 0 :(得分:1)
对于设计良好的组件中的每次更改,您不需要往返服务器,客户端应该能够处理大多数情况,除非服务器必须立即验证数据
所有内容的反模式都需要回发或使用.NET的懒惰版本的ajax(当服务器处理微小的部分时,例如,将项目添加到组合中)并不是很好,而JavaScript是可以做的那些简单的任务。
我下载了ajaxcontroltoolkit的ComboBox的源代码,不幸的是我没有提供良好的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反模式。
希望有所帮助,上帝保佑!
答案 1 :(得分:0)
禁用组合框的autopostback
,并尝试在页面末尾放置类似于后续代码的内容。
<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>
我还没有测试过这段代码,但想法是只在输入新值时才让组合进行回发(即使autopostback为false)。如果这样可行,您将不再需要该按钮;)