带有XML数据源的Ext.NET GridPanel

时间:2011-03-08 15:55:24

标签: c# asp.net ext.net

在.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对象。最终结果:

enter image description here

值得注意的一件事是,虽然它可能没有数据,但它确实包含所有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中存在值时生成'true'值,否则为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)此时,我知道它正在加载数据,因为项目现在正好显示,但不幸的是复选框没有。所以我创建了生成我的string / bool / bool / bool / bool / bool对象列表的函数,用bool值替换为1或0.所以我的xml现在为1表示真值,例如。现在就像一个魅力。

现在进入下一步,当按钮事件被点击到具有重复结构的XML文件时,从商店中提取数据。

再次感谢杰弗里

1 个答案:

答案 0 :(得分:1)

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

以下示例演示如何将<asp:XmlDataSource>控件绑定到<ext:Store>,请参阅

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

希望这有帮助。


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

以下示例演示了使用.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文件转换为<asp:XmlDataSource>可以处理的可消化格式。