【问题标题】:Ext.NET GridPanel with XML datasource带有 XML 数据源的 Ext.NET GridPanel
【发布时间】:2011-03-08 15:55:24
【问题描述】:

在我的 .aspx 文件中:

<asp:XmlDataSource runat="server" ID="XmlDS" />
...
<ext:ResourceManager ID="ResourceManager1" runat="server" />
<ext:GridPanel
                                           ID="GridPanel1"
                                           runat="server"
                                           StripeRows="true"
                                           Title="User Permissions"
                                           TrackMouseOver="true"
                                           Width="600"
                                           Height="350"
                                           AutoExpandColumn="Item">
                                           <Store>
                                                <ext:Store ID="Store1" runat="server">
                                                     <Reader>
                                                         <ext:ArrayReader>
                                                             <Fields>
                                                                   <ext:RecordField Name="Item" /> 
                                                                   <ext:RecordField Name="Access1" Type="Boolean" />
                                                                   <ext:RecordField Name="Access2" Type="Boolean" />
                                                                   <ext:RecordField Name="Access3" Type="Boolean" />
                                                                   <ext:RecordField Name="Access4" Type="Boolean" />
                                                                   <ext:RecordField Name="Access5" Type="Boolean" />
                                                             </Fields>
                                                         </ext:ArrayReader>
                                                     </Reader>
                                                </ext:Store>
                                          </Store>
                                          <ColumnModel ID="ColumnModel1" runat="server">
                                              <Columns>
                                                  <ext:Column ColumnID="Item" Header="Item" DataIndex="Item" />
                                                  <ext:Column ColumnID="Access1" Header="Access1" DataIndex="Access1" />
                                                  <ext:Column ColumnID="Access2" Header="Access2" DataIndex="Access2" />
                                                  <ext:Column ColumnID="Access3" Header="Access3" DataIndex="Access3" />
                                                  <ext:Column ColumnID="Access4" Header="Access4" DataIndex="Access4" />
                                                  <ext:Column ColumnID="Access5" Header="Access5" DataIndex="Access5" />
                                              </Columns>
                                          </ColumnModel>
                                          <SelectionModel>
                                              <ext:RowSelectionModel ID="RowSelectionModel1" runat="server" SingleSelect="true" />
                                          </SelectionModel>
                               </ext:GridPanel>

请注意,我没有使用 ExtJS/Ext.NET 的经验,因此根据http://forums.ext.net/showthread.php?10205-More-Information-Required 上的面板使用方式使用了 GridPanel 代码

它正在使用 JSON 对象。在尝试整个 ExtJS 方法之前,我发现它可以使用 XML 或 JSON。当下拉列表的选定索引发生更改时,它会加载该用户的权限并将其添加到 DataTable 对象(行是 string、bool、bool、bool、bool、bool),我已成功为其创建了 XML 对象。该函数返回一个字符串 (tempData),它是相关 XML 文档的地址。所以这是我没有在网格中加载任何结果的代码:

if (tempData != String.Empty)
        {
            XmlDS.DataFile = tempData;
            Store1.DataSource = XmlDS;
            Store1.DataBind();
            GridPanel1.Reload();
            File.Delete(tempData);
        }

试过 GridPanel1.RefreshView(),它说它需要一个 AJAX 请求,但在上面找不到任何东西。 Reload() 没有做我想做的事情(不会像 RefreshView() 那样抛出异常并且可以正常通过,但不会加载数据。

我认为 GridPanel 的东西是从使用 JSON 对象的地方借来的,也许是 asp:XmlDataSource 对象不能用于它的事实。但我真的不知道如何让它加载这些数据

我也尝试将数据源设置为表本身,它会加载数据,但它将字符串值加载为空字符串并将所有布尔值加载为 false。

感谢您提供的任何帮助。如果需要更多信息,请告诉我。

谢谢,


我一辈子都无法让它加载 XML。我在 ext.net 站点(Geoffrey 给出的同一个站点)上找到了一个使用 .xml 和 .xsl 文件的示例。我使用 c# 生成 .xml 文档,但我没有与之配套的 .xsl 文件(我也不确定应该如何构建 .xsl 文档以尝试生成文件)。

所以我试图传递一个有 15 行的 DataTable 对象。最终结果:

需要注意的一点是,虽然它可能没有数据,但它确实包含所有 15 行。我假设它确实尝试加载数据集但失败了。

在我的 .aspx 文件中:

<ext:ResourceManager ID="ResourceManager1" runat="server" />
                                  <ext:GridPanel
                                           ID="GridPanel1"
                                           runat="server"
                                           StripeRows="true"
                                           Title="User Permissions"
                                           TrackMouseOver="true"
                                           Width="600"
                                           Height="350"
                                           AutoExpandColumn="Item">
                                           <Store>
                                                <ext:Store ID="Store1" runat="server">
                                                     <Reader>
                                                         <ext:JsonReader>
                                                             <Fields>
                                                                   <ext:RecordField Name="Item" /> 
                                                                   <ext:RecordField Name="Access1" Type="Boolean" />
                                                                   <ext:RecordField Name="Access2" Type="Boolean" />
                                                                   <ext:RecordField Name="Access3" Type="Boolean" />
                                                                   <ext:RecordField Name="Access4" Type="Boolean" />
                                                                   <ext:RecordField Name="Access5" Type="Boolean" />
                                                             </Fields>
                                                         </ext:JsonReader>
                                                     </Reader>
                                                </ext:Store>
                                          </Store>
                                          <ColumnModel ID="ColumnModel1" runat="server">
                                              <Columns>
                                                  <ext:Column ColumnID="Item" Header="Item" DataIndex="Item" />
                                                  <ext:CheckColumn ColumnID="Access1" Header="Access1" DataIndex="Access1" Editable="true" Width="40px" /> 
                                                  <ext:CheckColumn ColumnID="Access2" Header="Access2" DataIndex="Access2" Editable="true" Width="40px" />
                                                  <ext:CheckColumn ColumnID="Access3" Header="Access3" DataIndex="Access3" Editable="true" Width="40px" />
                                                  <ext:CheckColumn ColumnID="Access4" Header="Access4" DataIndex="Access4" Editable="true" Width="40px" />
                                                  <ext:CheckColumn ColumnID="Access5" Header="Access5" DataIndex="Access5" Editable="true" Width="40px" />
                                              </Columns>
                                          </ColumnModel>
                                          <SelectionModel>
                                              <ext:RowSelectionModel ID="RowSelectionModel1" runat="server" SingleSelect="true" />
                                          </SelectionModel>
                               </ext:GridPanel>

这是我尝试加载数据的部分(tempData 是 XML 文档的字符串地址,因为 xml 是在下拉列表选择后生成的)。

List<List<Object>> PermissionList = BL.Person.getPermissionsList(Convert.ToInt32(ddlUserName.SelectedValue));

        DataTable table = BL.Data.CreatePermissionsTable(PermissionList);

        string tempData = BL.Data.CreateXML(table, "Permission", Convert.ToInt32(ddlUserName.SelectedValue));

        if (tempData != String.Empty)
        {
            ChangeAccess.Style.Add("display", "block");
            Store1.DataSource = table;
            Store1.DataBind();
            File.Delete(tempData);
        }

请注意,当使用 DataSet 作为对象时,字符串 tempdata/file.delete 是毫无意义的。

最终目标是使用 XML,但如果同时需要使用 DataTable,那么我会走这条路。我目前不使用 json/ 方法的原因是,如前所述,数据是从后面的代码生成的(它在 item/personid/accesslevel 表的 useraccess 中存在值时生成“真”值,否则为 false。不是实际的数据库条目)。

再次感谢,


XML 结构:

<permissions>
    <permission>
        <Item>Process 1</Item>
        <Access1>True</Access1>
        <Access2>True</Access2>
        <Access3>False</Access3>
        <Access4>False</Access4>
        <Access5>False</Access5>
    </permission>
    <permission>
        <Item>Process 2</Item>
        <Access1>True</Access1>
        <Access2>True</Access2>
        <Access3>True</Access3>
        <Access4>False</Access4>
        <Access5>False</Access5>
    </permission>
</permissions>

我尝试再次重新加载 .XML,这一次它似乎在拉动,某种程度上,生成的行在返回的 100 行附近(超过 15 个权限元素)。

请注意,我没有 TransformFile 的 .xsl 文件。我希望这不会是一个问题?

我需要使用实际代码登录桌面,我会尝试获取您请求的渲染内容。感谢杰弗里的帮助。


最后一次编辑我发誓

在 Geoffrey 的帮助和一些“这个例子有什么我没有的?”之间。几个步骤后我就可以让它工作了:

1) 必须生成一个 .XSL 文件来为 .XML 文件提供结构。我使用plants.xsl 文件作为模板。

2) 如果设置了我的 XmlDS 对象,我将其更改为:

if (tempData != String.Empty)
        {

            ChangeAccess.Style.Add("display", "block");
            XmlDS.DataFile = tempData;
            XmlDS.TransformFile = tempData.Remove(tempData.LastIndexOf('\\')) + "\\Permissions.xsl";
            Store1.DataSource = XmlDS;
            Store1.DataBind();
            File.Delete(tempData);
        } 

3) 在这一点上,我知道它正在加载数据,因为项目现在可以正确显示,不幸的是复选框没有。因此,我创建了生成字符串/布尔/布尔/布尔/布尔/布尔对象列表的函数,以将布尔值替换为 1 或 0。因此,例如,我的 xml 现在为 1 表示真值。现在就像一个魅力。

现在进入下一步,将按钮事件单击到具有重复结构的 XML 文件时从 Store 中提取数据。

再次感谢杰弗里

【问题讨论】:

    标签: c# asp.net ext.net


    【解决方案1】:

    您可能需要发布一个演示完整场景的代码示例。您不必在初始 Page_Load 上调用 GridPanel1.Reload()

    以下示例演示将&lt;asp:XmlDataSource&gt; 控件绑定到&lt;ext:Store&gt;,请参阅

    http://examples.ext.net/#/GridPanel/DataSource_Controls/XmlDataSource/

    希望这会有所帮助。


    编辑:我做了一些研究,看来需要 .xslt 的原因是因为 &lt;asp:XmlDataSource&gt; 不能/不解析内部属性。内部属性必须转换为属性。

    以下示例演示了使用 .xml 的完整方案,其中将属性配置为属性并将 True|False 转换为小写 true|false。

    示例 (.xml)

    <?xml version="1.0" encoding="utf-8" ?>
    <permissions>
        <permission Item="Process 1" Access1="true" Access2="true" Access3="false" Access4="false" Access5="true" />
        <permission Item="Process 2" Access1="true" Access2="true" Access3="true" Access4="false" Access5="false" />
        <permission Item="Process 3" Access1="false" Access2="true" Access3="false" Access4="false" Access5="true" />
        <permission Item="Process 4" Access1="true" Access2="true" Access3="false" Access4="false" Access5="false" />
        <permission Item="Process 5" Access1="true" Access2="false" Access3="false" Access4="false" Access5="true" />
        <permission Item="Process 6" Access1="true" Access2="false" Access3="true" Access4="false" Access5="true" />
    </permissions>
    

    示例 (.aspx)

    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>GridPanel with XmlDataSource - Ext.NET Examples</title>
        <link href="../../../../resources/css/examples.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <form runat="server">
            <ext:ResourceManager runat="server" />
    
            <asp:XmlDataSource 
                ID="XmlDataSource1" 
                runat="server" 
                DataFile="sample.xml"
                />
    
            <ext:GridPanel 
                runat="server" 
                Width="650" 
                Height="300" 
                Title="Example"
                AutoExpandColumn="Item">
                <Store>
                    <ext:Store runat="server" DataSourceID="XmlDataSource1">
                        <Reader>
                            <ext:JsonReader>
                                <Fields>
                                    <ext:RecordField Name="Item" />
                                    <ext:RecordField Name="Access1" Type="Boolean" />
                                    <ext:RecordField Name="Access2" Type="Boolean" />
                                    <ext:RecordField Name="Access3" Type="Boolean" />
                                    <ext:RecordField Name="Access4" Type="Boolean" />
                                    <ext:RecordField Name="Access5" Type="Boolean" />
                                </Fields>
                            </ext:JsonReader>
                        </Reader>
                    </ext:Store>
                </Store>
                <ColumnModel runat="server">
                    <Columns>
                        <ext:Column ColumnID="Item" Header="Item" DataIndex="Item" />
                        <ext:Column Header="Access1" DataIndex="Access1" />
                        <ext:Column Header="Access2" DataIndex="Access2" />
                        <ext:Column Header="Access3" DataIndex="Access3" />
                        <ext:Column Header="Access4" DataIndex="Access4" />
                        <ext:Column Header="Access5" DataIndex="Access5" />
                    </Columns>
                </ColumnModel>
            </ext:GridPanel>    
        </form>
    </body>
    </html>
    

    显然,您可能无法控制 .xml 文件的格式,因此使用 .xslt 转换提供了一种将 .xml 文件转换为&lt;asp:XmlDataSource&gt; 可以处理的可消化格式的方法。

    【讨论】:

    • 嘿,杰弗里,谢谢。奇怪的是,它看起来像是我在找到该链接并注意到我没有 XSL(也不知道如何生成它)的最后一次编辑,所以我开始尝试 DataTable 绑定(但如果可能的话,我希望绑定到 XML)。当我注意到 Reload() 反复移动到列表顶部时,我注意到它的行为实际上在做什么。我即将进行编辑以显示我当前的问题。
    • 感谢您的更新。正如您所指出的,数据存在是因为 GridPanel 正在呈现约 15 行。我的猜测是 RecordField .Name 属性与 XmlDataSource 中呈现的名称不正确匹配。如果这一切都发生在 Page_Load 上,请在页面上View &gt; Source 并发布 Ext.NET 正在呈现的初始化脚本块。该脚本块也应该包含数据。或发送至 support@ext.net,如果您愿意保密。
    • 尝试加载 XML 时,我什么也没得到,所以我认为我完全不正确。我获得 15 行的方法是使用 DataTable(不完全是我想要走的路线,因为我打算将网格导出回 XML 以导出到数据库)。此外,RecordField 名称匹配。我编辑了问题以包含 XML 结构,这也可能是我错的地方。
    • 编辑。太棒了,在我模拟了一个 XSL 文件(使用 plant.xsl 作为模板完全猜测)后,我很幸运并且加载了它。它没有从 True#> 项中加载复选框,所以我做了它,以便生成 XML 的数据对象使用 1 表示真,0 表示假。奇迹般有效。现在只是为了得到将更改导出到 XML 中相同结构的东西。非常感谢您的帮助杰弗里
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多