c#ext.net:从代码后面的组合框中插入项目

问题描述 投票:0回答:3

我想用2个项目创建一个组合框。项目的文本应以不同的格式显示DateTime.Now。组合框是行扩展器。这是组合的代码:

<ext:ComboBox  runat="server" ID="cmbFormatFFC"   DataIndex="DateFormat"          FieldLabel="Date Format"             Width="400" ForceSelection="true" EmptyText="Select date format...">
      <Listeners>
            <BeforeRender Handler="#{DirectMethods}.fillComboDates()" />

并在代码后面:

[DirectMethod]
        public void fillComboDates()
        {
            cmbFormatFFC.Items.Insert(0,new Ext.Net.ListItem(DateTime.Now.ToString("d/M/yyyy"), "d/M/yyyy"));
            cmbFormatFFC.Items.Insert(1,new Ext.Net.ListItem(DateTime.Now.ToString("dd-MMM-yyyy"), "dd-MMM-yyyy"));
        }

但是,当我在应用程序中展开行时,我收到此错误:

未捕获的TypeError:无法将属性'component'设置为null

c# asp.net extjs combobox ext.net
3个回答
2
投票

您无法使用BeforeRender加载商店数据。它发生在控制生命周期的早期。您最好的解决方案是在RowExpander上使用BeforeExpand事件。此外,由于您的ComboBox中有静态数据,因此您只想执行一次DirectEvent。这是一个例子:

*的.aspx

<ext:GridPanel ID="grid" runat="server">
    <ColumnModel>
        <Columns>
            <ext:Column runat="server" DataIndex="Field1" />
        </Columns>
    </ColumnModel>
    <Store>
        <ext:Store runat="server" ID="store">
            <Model>
                <ext:Model runat="server">
                    <Fields>
                        <ext:ModelField Name="Field1" />
                    </Fields>
                </ext:Model>
            </Model>
        </ext:Store>
    </Store>
    <Plugins>
        <ext:RowExpander runat="server">
            <Component>
                <ext:ComboBox runat="server" ValueField="Key" DisplayField="Display">
                    <Store>
                        <ext:Store runat="server" ID="comboStore" OnReadData="Store_ReadData">
                            <Model>
                                <ext:Model runat="server">
                                    <Fields>
                                        <ext:ModelField Name="Key" />
                                        <ext:ModelField Name="Display" />
                                    </Fields>
                                </ext:Model>
                            </Model>
                        </ext:Store>
                    </Store>
                </ext:ComboBox>
            </Component>
            <Listeners>
                <BeforeExpand Handler="if (comboStore.getCount() == 0) comboStore.reload();" />
            </Listeners>
        </ext:RowExpander>
    </Plugins>
</ext:GridPanel>

* .aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack || X.IsAjaxRequest)
        return;

    store.DataSource = new object[] 
    { 
        new { Field1 = "Row 1" },
        new { Field1 = "Row 2" },
        new { Field1 = "Row 3" }
    };

    store.DataBind();
}

protected void Store_ReadData(object sender, StoreReadDataEventArgs e)
{
    comboStore.DataSource = new object[] 
    { 
        new { Key = DateTime.Now.ToString("d/M/yyyy"), Display = "d/M/yyyy" },
        new { Key = DateTime.Now.ToString("dd-MMM-yyyy"), Display = "dd-MMM-yyyy" }
    };

    comboStore.DataBind();
}

0
投票

确保您的组合已成功初始化,并且您的方法fillComboDates()返回值


0
投票

可能是由Ext.Net生成并发送给客户端的JS正在执行cmbFormatFFC之前执行。为了确保以后发生,您可以将侦听器从BeforeRender更改为BoxReady

© www.soinside.com 2019 - 2024. All rights reserved.