如何在sitefinity设计器中初始化rad组合框的选定索引?

时间:2015-09-02 14:57:12

标签: javascript c# telerik ascx sitefinity

我用设计师使用迅雷制作了一个sitefinity mvc小部件。小部件有4个字符串:1个用于复选框,2个用于标题和内容,1个用于radcombobox选择。我无法使radcombobox上的功能工作(无法设置selectedindex)。我可以使用以下代码更改radcombobox的初始值和标题,以及正确获取值:

SitefinityWebApp.WidgetDesigners.PanelWidget.PanelWidgetDesigner.prototype = {
refreshUI: function () {
    var controlData = this._propertyEditor.get_control().Settings;
    jQuery(this.get_panelStyle())[0].value = controlData.PanelStyle;
    jQuery(this.get_panelStyle())[0].title = controlData.PanelStyle;
}
applyChanges: function () {
    var controlData = this._propertyEditor.get_control().Settings;
    controlData.PanelStyle = jQuery(this.get_panelStyle()).val();
}
get_panelStyle: function () { return this._panelStyle; },
set_panelStyle: function (value) { this._panelStyle = value; }
}

我认为refreshUI函数是我需要设置radcombobox selectedIndex的地方,但是看起来radcomboboxes没有selectedIndex属性!我应该做这样的事情:

refreshUI: function () {
    var controlData = this._propertyEditor.get_control().Settings;
    jQuery(this.get_panelStyle())[0].value = controlData.PanelStyle;
    jQuery(this.get_panelStyle())[0].title = controlData.PanelStyle;
}

或者,在我的ascx文件中,我应该使用一些javascript来添加一些脚本标记,如下所示:

<ol>
<li class="sfFormCtrl">
    <asp:Label runat="server" AssociatedControlID="PanelStyle" CssClass="sfTxtLbl">Panel Style</asp:Label>
    <asp:RadComboBox ID="PanelStyle" runat="server" CssClass="sfTxt"  />
    <div class="sfExample">The panel style to be displayed</div>
</li>
</ol>

<script type="text/javascript">
function pageLoad() {
    var combo = $find(<%= PanelStyle.ClientID%>);
    var item = combo.findItemByValue("3");
    item.SELECT();
}
</script>

顺便说一下,这个javascript代码不起作用。它抛出错误:Uncaught TypeError:无法读取null的属性'findItemByValue'。现在我知道这意味着$ find没有得到radcombobox,但是在线的每一段代码都说要使用那种方法。

最后,如果这看起来太多了,请告诉我。我对堆栈溢出问题不太满意。

1 个答案:

答案 0 :(得分:0)

所以我找到了答案。我希望这将有助于将来的某些人。我最终从radcombobox更改为raddropdownlist。它也可以用radcombobox完成,但我还没有做到这一点。

注意:更新raddropdownlist的所有代码都需要在.ascx文件中作为脚本标记,而不是在.js文件中。

对于raddropdownlist,有一个OnClientLoad事件。您可以将其放在.ascx文件中,如下所示:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:divider="@color/accent"
    android:dividerHeight="0dp"
    android:background="#ff669900"
    tools:context=".NavigationDrawerFragment"
    android:clickable="true"
    android:alpha="255" /> 

然后我在.ascx文件中做了一些javascript:

<li class="sfFormCtrl">
    <asp:Label runat="server" AssociatedControlID="Tag" CssClass="sfTxtLbl">Tag Size</asp:Label>
    <asp:RadDropDownList ID="Tag" runat="server" CssClass="sfTxt" OnClientLoad="timer" />
    <div class="sfExample">H1, H2, H3, H4, H5, or H6</div>
</li>

简单解释一下,我创建一个计时器以便加载所有内容,但是你可以将计时器设置为0. onclientload事件调用timer函数,然后调用changeUP函数,它获取值,并循环遍历项目,然后设置所选项目等于该值。

我最终使用了telerik下拉列表的文档:http://docs.telerik.com/devtools/aspnet-ajax/controls/dropdownlist/client-side-programming/objects/raddropdownlist-object

编辑:.js文件也需要一些代码:

<script type="text/javascript">
function timer(sender, tagvar) {
    window.setTimeout(function () { changeUP(sender, tagvar) }, 0000);
}

function changeUP(sender) {
    var combo2 = $telerik.$("#<%= Tag.ClientID%>");
    var value = combo2.val();

    var combo = sender;
    var item = combo.get_selectedItem();
    item.set_selected(false);
    var items = combo.get_items();

    for (var i = 0; i < 6; i++) {
        var index = items.getItem(i);
        if (index.get_text() === value) {
            index.set_selected(true);
        }
    }
}

注意:这仅适用于raddropdownlist项目。我删除了其他项目的代码。