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

How do you initialize the selected index of rad combo boxes in a sitefinity designer?

我用 thunder 和 designer 做了一个 sitefinity mvc widget。该小部件有 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 的地方,但是radcombobox 似乎没有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: Cannot read 属性 'findItemByValue' of null。现在我知道这意味着 $find 没有得到 radcombobox,但是网上的每段代码都说要使用该方法。

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

所以我找到了答案。我希望这会在将来帮助某人。我最终从 radcombobox 更改为 raddropdownlist。它可能也可以用 radcombobox 来完成,但我还没有这样做。

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

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

<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>

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

<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);
        }
    }
}

简单解释一下,我制作了一个计时器,以便加载所有内容,但您可以将计时器设置为 0。onclientload 事件调用计时器函数,然后调用 changeUP 函数,该函数获取值,并循环通过项目,然后设置等于该值的所选项目。

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

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

refreshUI: function () {
    var controlData = this._propertyEditor.get_control().Settings;
    jQuery(this.get_panelStyle()).val(controlData.PanelStyle);
},
applyChanges: function () {
    var controlData = this._propertyEditor.get_control().Settings;
    controlData.PanelStyle = jQuery(this.get_panelStyle()).val();
}

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