【问题标题】:How to display xml-string using DataSet in GridView如何在 GridView 中使用 DataSet 显示 xml 字符串
【发布时间】:2013-10-10 02:09:43
【问题描述】:

我应该在 aspx 中使用什么来在 gridview 中显示 xml 字符串?

Data 是 xml 字符串:

<Study>
      <DocTypes>
        <DocType>
          <Name>doctype1</Name>
          <Evaluate>false</Evaluate>
        </DocType>
        <DocType>
          <Name>doctype2</Name>
          <Evaluate>true</Evaluate>
        </DocType>
      </DocTypes>
      <DocumentView>true</DocumentView>
      <ColumnarView>true</ColumnarView>
</Study>

在 display.aspx.cs 后面的代码中,我使用 XmlTextReader,然后将 GridView 与 DataSet 绑定:

        StringReader sr = new StringReader(Data);
        XmlTextReader xtr = new XmlTextReader(sr);
        DataSet ds = new DataSet();
        ds.ReadXml(xtr);
        GridView1.DataSource = ds;
        GridView1.DataBind();

我应该在 display.aspx 中写什么?

<asp:GridView ID="GridView1" runat="server">
 <Column> ???? </Column>    

EDIT 我发现使用 dataset.Tables[number] 可以显示内容,但我也得到了一些带有 _ID 的奇怪列。如何删除 _ID 列?

EDIT 现在我看不到 DataSet 中的 DocTypes。我也应该用什么来显示它们?

编辑如果我更改 dataset.Tables[number] 的数量,我会得到 Doctypes 和 DocTypePermissions 但如何合并表格???

【问题讨论】:

  • 您希望在 GridView 中显示哪些所有数据,使用当前 XML 字符串示例,您无法在 GridView 中加载整个 XML
  • 我想加载所有内容。 DataSet 是错误的方法吗?
  • @Georg - 带有 _Id 的列用于关系。在数据集中,您将拥有 Doctypes 表的父级到 Doctype 表。如果删除关系并保存 xml,Doctype 节点将被附加到 Study 而不是 Doctypes 节点。

标签: c# asp.net gridview dataset


【解决方案1】:

当您将 xml 加载到数据集中时,ite 在数据集中创建 3 个表:

  1. 学习
  2. DocTypes 和
  3. 文档类型

它还会创建DataRelation。这种关系基于隐藏ColumnMapping 的列,据我所知,该字段的命名约定是 ParentTable FieldName_Id。如果要将数据保存回 XML,则需要此字段。

要在 Gridview 中隐藏此字段,我将设置 AutoGenerateColumns= "false" 并仅填充网格中我需要的字段。如果你想将其设置为 true,在 GridView 的 RowDataBound 事件中,你必须将此单元格的可见性设置为 false:e.Row.Cells[2].Visible = false;

现在您知道了表名,它们的字段名,您可以轻松地将它们绑定到 GridView。如示例所示,将 Gridview 绑定到“Doc​​Type”表。

回答您的第三次编辑,您不需要合并表格。您正在将重复行绑定到 GridView,并且只需使用标签或文本框或复选框来显示非重复行,即 DocumentView 和 ColumnarView。

您可以像这样调用 PageLoad 中的方法:

 protected void Page_Load(object sender, EventArgs e)
 {
      if (!IsPostBack)
      {
           BindData();
      }
 }

您的 BindData() 方法中的答案可能如下所示:

private void BindData()
{
    DataSet ds = LoadXml();
    GridView1.DataSource = ds.Tables["DocType"];
    GridView1.DataBind();
    DataRow r = ds.Tables["Study"].Rows[0];
    chkDocumentView.Checked = bool.Parse(r[1].ToString());
    chkColumnarView.Checked = bool.Parse(r[2].ToString());
}

现在,读取xml字符串的方法:

private DataSet LoadXml() 
{
    string Data = @"<Study>
                        <DocTypes>
                        <DocType>
                            <Name>doctype1</Name>
                            <Evaluate>false</Evaluate>
                        </DocType>
                        <DocType>
                            <Name>doctype2</Name>
                            <Evaluate>true</Evaluate>
                        </DocType>
                        </DocTypes>
                        <DocumentView>true</DocumentView>
                        <ColumnarView>true</ColumnarView>
                </Study>";

    StringReader sr = new StringReader(Data);
    XmlTextReader xtr = new XmlTextReader(sr);
    DataSet ds = new DataSet();
    ds.ReadXml(xtr);

    return ds;           
}

还有 GridView 和复选框的标记:

<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server">
    <Columns>
        <asp:BoundField DataField="Name" />  
        <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox Text="Evaluate" runat="server" Checked='<%#bool.Parse(Eval("Evaluate").ToString())%>'/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<asp:CheckBox ID="chkDocumentView" Text="DocumentView" runat="server" />
<asp:CheckBox ID="chkColumnarView" Text="ColumnarView" runat="server"/>

希望对你有帮助!

【讨论】:

    【解决方案2】:

    我想这会对你有所帮助。

      StringReader sr = new StringReader(data);
      XmlTextReader xtr = new XmlTextReader(sr);
      DataSet ds = new DataSet();
      ds.ReadXml(xtr);
      ds.Merge(ds, true);
      GridView1.DataSource = ds.Tables[1];
      GridView1.DataBind();
    

    也请通过此链接,

    http://support.microsoft.com/kb/317662

    【讨论】:

    • 不需要在aspx页面中添加列。
    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多