2016-03-23 5 views
2

Ich habe ein Problem mit dem Anzeigen einer Tabelle, die programmgesteuert generiert wird. Lassen Sie mich erklären. Ich habe eine XML, die wie folgt suchen:So zeigen Sie eine Tabelle an, die programmgesteuert in einer ASPX-Website generiert wird

<?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> 

Diese Methode:

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; 

wird immer die Knoten in ein Expando-Objekt. Mit diesem Objekt möchte ich programmatisch eine Tabelle auf einer .aspx-Website erzeugen. Zum Generieren rufe ich diese Methode auf:

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); 
     } 
    } 
} 

Alles ist soweit in Ordnung. Die Zeilen und Zellen werden alle mit dem richtigen Wert zur Tabelle hinzugefügt, und es gibt keine Ausnahmen oder irgendetwas anderes, , aber Die Tabelle wird nicht auf der Website angezeigt. Ich weiß wirklich nicht, warum nichts angezeigt wird, also hoffe ich, dass Sie mir helfen können.

+0

Wenn Ihr HTML baut korrekt Sie nicht zeigen, müssen wir alle, dass Code, es ist nur Ablenkung. Ihr Problem besteht darin, die Tabelle auf der Seite zu erhalten. Eine von vielen Möglichkeiten, dies zu tun, ist [hier demonstriert] (https://msdn.microsoft.com/en-us/library/system.web.ui.htmlcontrols.htmltable (v = vs.110) .aspx) – Crowcoder

Antwort

3

Um diese dynamisch generierte Tabelle anzuzeigen, müssen Sie sie auch irgendwo auf Seite hinzufügen. Legen Sie einen Platzhalter auf Ihrer Seite als

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

dann auf Code hinter Ort, um Ihren Tisch zu diesem Halter als:

Table t; 
// generate the table... 
// add it to page. 
phOnme.Controls.Add(t); 
+1

danke , das hat das Problem gelöst! –

Verwandte Themen