2

我在显示以编程方式生成的表格时遇到问题。让我解释。我有一个看起来像这样的 XML:

<?xml version="1.0" encoding="utf-8" ?>
<Fragebogen>
  <Header>Header</Header>
  <Tables>
    <Table>
      <Rows>
        <Row>
          <Cells>
            <Cell>Cell 1 Row 1</Cell>
          </Cells>
        </Row>
        <Row>
          <Cells>
            <Cell>Cell 1 Row 2</Cell>
          </Cells>
        </Row>
        <Row>
          <Cells>
            <Cell>Cell 1 Row 3</Cell>
            <Cell>Cell 2 Row 3</Cell>
            <Cell>Cell 3 Row 3</Cell>
          </Cells>
        </Row>
      </Rows>
    </Table>
  </Tables>
</Fragebogen>

这种方法:

if (String.IsNullOrWhiteSpace(file) && node == null) return null;

// If a file is not empty then load the xml and overwrite node with the
// root element of the loaded document
node = !String.IsNullOrWhiteSpace(file) ? XDocument.Load(file).Root : node;

IDictionary<String, dynamic> result = new ExpandoObject();

// implement fix as suggested by [ndinges]
var pluralizationService =
    PluralizationService.CreateService(CultureInfo.CreateSpecificCulture("en-us"));

// use parallel as we dont really care of the order of our properties
node.Elements().AsParallel().ForAll(gn =>
{
    // Determine if node is a collection container
    var isCollection = gn.HasElements &&
        (
        // if multiple child elements and all the node names are the same
            gn.Elements().Count() > 1 &&
            gn.Elements().All(
                e => e.Name.LocalName.ToLower() == gn.Elements().First().Name.LocalName) ||

            // if there's only one child element then determine using the PluralizationService if
        // the pluralization of the child elements name matches the parent node. 
            gn.Name.LocalName.ToLower() == pluralizationService.Pluralize(
                gn.Elements().First().Name.LocalName).ToLower()
        );

    // If the current node is a container node then we want to skip adding
    // the container node itself, but instead we load the children elements
    // of the current node. If the current node has child elements then load
    // those child elements recursively
    var items = isCollection ? gn.Elements().ToList() : new List<XElement>() { gn };

    var values = new List<dynamic>();

    // use parallel as we dont really care of the order of our properties
    // and it will help processing larger XMLs
    items.AsParallel().ForAll(i => values.Add((i.HasElements) ?
       GetExpandoFromXml(null, i) : i.Value.Trim()));

    // Add the object name + value or value collection to the dictionary
    result[gn.Name.LocalName] = isCollection ? values : values.FirstOrDefault();
});
return result;

正在将节点放入 Expando-Object。有了这个对象,我想以编程方式在 .aspx 网站中生成一个表。为了生成我调用这个方法:

dynamic fragebogen = GetExpandoFromXml(SSG.Fragebogen.Properties.Settings.Default.ConfigPath);
var header = fragebogen.Header;
var tables = fragebogen.Tables;
Table t;
var rows = tables[0].Rows;
TableRow r;
dynamic cells = null;
for (int i = 0; i < rows.Count; i++)
{
    cells = rows[i].Cells;
}
TableCell c;

foreach (var table in tables)
{
    t = new Table();
    foreach (var row in rows)
    {
        r = new TableRow();
        t.Rows.Add(r);
        foreach (var cell in cells)
        {
            c = new TableCell();
            c.Text = cell;
            r.Cells.Add(c);
        }
    }
}

到目前为止一切都很好。行和单元格都以正确的值添加到表中,没有异常或其他任何内容,该表未显示在网站中。我真的不知道为什么没有任何显示,所以我希望你能帮助我。

4

1 回答 1

3

要显示这个动态生成的表格,您还需要将它添加到页面的某个位置。在您的页面上放置一个 PlaceHolder 作为

<asp:PlaceHolder runat="server" ID="phOnme"></asp:PlaceHolder>

然后在后面的代码中将您的桌子放在该支架上,如下所示:

Table t;
// generate the table...
// add it to page.
phOnme.Controls.Add(t);
于 2016-03-23T11:47:09.323 回答