2010-08-09 14 views
1

J'ai un tableau n par n String qui doit être sorti sur une page web, j'ai trouvé quelques solutions qui nécessitent beaucoup de lignes de code (read: many) (généralement en le convertissant en DataTable puis en se liant à un GridView). Et presque toutes ces solutions ne fonctionneront même pas pour la nature dynamique de mes tableaux (je ne sais pas à l'avance combien de colonnes et de lignes vont être générées, ni les noms des colonnes: c'est contrôlé par l'utilisateur).J'ai un tableau de chaînes 2d (nxn) en C#, comment l'obtenir de façon dynamique sur une page Web (Essayé DataTables/Binding, etc ...)

Je trouve cela à toutes ces solutions pour être un peu ridicule et dans certains cas, plus grand que mon module entier que je l'ai déjà conçu, il suffit de sortir un petit morceau de mes données ...

Ceci est un exemple de ce que j'ai essayé de le faire:

object1 = (string[,]) r.GetSymbol("stringArray"); //I retrieve n x n array and cast as a string contained in an object (have to do this because I am using COM interfaces). 
    Output_GridView.DataSource = object1; //(If I try to convert this to a string, it returns the dataType "string" not the 2d array 
    Output_GridView.DataBind(); 

cela ne fonctionne pas (il faudrait un tableau 1d selon l'erreur que je reçois, je ne sais pas pourquoi serait limité DataSource/GridView comme celui-ci), J'ai lu des solutions très moche, mais vraiment, tout ce dont j'ai besoin est juste d'écrire une boucle for imbriquée pour afficher n colonnes et n lignes à la page ASP.NET. Quelqu'un peut-il me aider (pourquoi une telle tâche triviale doivent être si difficile?)

Merci pour tous les commentaires =)

-Dave

+0

*** supprime même commentaire si cynique ***. Pouvez-vous nous en dire un peu plus sur la nature de vos données et comment vous voulez les afficher? – Jeroen

+0

Il s'agit de données numériques avec des en-têtes de colonne et de ligne (bien que l'ensemble soit techniquement des chaînes). Il doit être affiché dans un format de table, si je pouvais juste superposer le tableau 2d sur la première page, ce serait fantastique, il est déjà formaté correctement. – Dave

Répondre

1

Bien que laid, code ASP Nuggets dans le. ASPX travaillerait:

<table> 
    <% for(int i = 0; i < ArrayDimensionLength; i++) { %> 
    <tr> 
     <td>RowHeader</td> 
     <% for(int j = 0; j < ArrayDimensionLength; j++) { %> 
     <td><%= Array[i,j] %> </td> 
     <% } %> 
    </tr> 
    <% } %> 
</table> 

... et dans le code-behind:

protected string[,] MyArray 
    { 
     get 
     { 
      //Insert your array here 
      return new string[,]{{"1", "1"}, {"2", "2"}}; 
     } 
    } 

    protected int ArrayDimensionLength 
    { 
     get 
     { 
      return (int)Math.Sqrt(MyArray.Length); 
     } 
    } 
2

pas pré TTY devrait vous donner un début

//setup the data 
    var random = new Random(); 
    int x = random.Next(14) + 1; 
    int y = random.Next(29) + 1; 

    var data = new int[x, y]; 
    for (int i = 0; i < x; i++) 
     for (int j = 0; j < y; j++) 
      data[i, j] = random.Next(100); 


    //create the data table 
    var table = new Table(); 
    for (int i = 0; i < x; i++) 
    { 
     var newRow = new TableRow(); 
     for (int j = 0; j < y; j++) 
     { 
      var newCell = new TableCell(); 
      newCell.Text = data[i,j].ToString(); 
      newRow.Cells.Add(newCell); 
     } 
     table.Rows.Add(newRow); 
    } 
    ux_Panel.Controls.Add(table); 

regards de Shlomo comme la meilleure solution à moins que vous voulez masser les données un peu plus

3

Avez-vous envisagé de créer simplement un contrôle Web personnalisé. J'ai créé un rapide qui accepte un tableau [,] et affiche simplement le contenu du tableau dans un div avec p autour de chaque valeur de tableau. C'est simple, léger et vous aurez un contrôle complet de la sortie.

Voici l'étape que vous devez mettre en œuvre:

Ajouter un nouveau projet à votre application Web et assurez-vous Référent System.web. Peut-être appeler le projet WebControls.

Ajoutez le code C# suivant à un nouveau fichier de classe que vous pouvez ajouter au projet.

CODE DE COMMANDE SUR MESURE:

using System.ComponentModel; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace WebControls 
{ 
    [ToolboxData("<{0}:ArrayDisplayControl runat=server></{0}:ArrayDisplayControl>")] 
    public class ArrayDisplayControl : WebControl 
    { 
    protected override HtmlTextWriterTag TagKey 
    { 
     get 
     { 
      return HtmlTextWriterTag.Div; 
     } 
    } 

     public string[,] DataSource 
     { 
      get 
      { 
       return (string[,])ViewState["DataSource"]; 
      } 
      set 
      { 
       ViewState["DataSource"] = value; 
      } 
     } 

     protected override void RenderContents(HtmlTextWriter output) 
     { 
      output.WriteBeginTag("div"); 

      for (int i = 0; i < DataSource.GetLength(0); i++) 
      { 
       for (int j = 0; j < DataSource.GetLength(1); j++) 
       { 
        output.WriteFullBeginTag("p"); 
        output.Write(DataSource[i, j]); 
        output.WriteEndTag("p"); 
       } 
      } 

      output.WriteEndTag("div"); 
     } 
    } 
} 

Maintenant, tout ce que vous devez faire est ref votre projet vient d'être ajouté à votre application web. propriétés -> ajouter une référence - sélectionnez des projets, puis le nom du nouveau projet.

Ok tout ce qui reste est d'ajouter une déclération au sommet de votre asp.page web afin que vous pouvez référencer le contrôle personnalisé comme ce qui suit:

<%@ Register Assembly="WebControls" Namespace="WebControls" TagPrefix="custom" %> 

référence à présent le contrôle en vous html comme suit:

<custom:ArrayDisplayControl ID="ctlArrayDisplay" runat="server" /> 

Ok, donc la dernière étape consiste à lier le contrôle à certaines données dans le code derrière - quelque chose comme ce qui suit:

protected void Page_Load(object sender, EventArgs e) 
{ 
      string[,] data = new string[2, 2] { { "Mike", "Amy" }, { "Mary", "Albert" } }; 

      ctlArrayDisplay.DataSource = data; 
      ctlArrayDisplay.DataBind(); 
} 

Et voici la sortie après l'exécution:

<div id="ctlArrayDisplay"> 
    <div><p>Mike</p><p>Amy</p><p>Mary</p><p>Albert</p></div> 
</div> 

J'espère que cela vous aidera à sortir de votre embouteillage.

Profitez-en!