У меня есть 2d (nxn) строковый массив в C #, как мне получить его динамически выводится на веб-страницу (Tried DataTables / Binding и т. Д ...) - PullRequest
1 голос
/ 10 августа 2010

У меня есть строковый массив n-n-n, который необходимо вывести на веб-страницу, я нашел некоторые решения, которые требуют много много (читай: много) строк кода (обычно его преобразовывают в DataTable, а затем связывают с GridView.).И почти все эти решения не будут работать даже для динамической природы моих массивов (я не знаю заранее, сколько столбцов и строк будет сгенерировано, ни названия столбцов: это контролируется пользователем).

Я нахожу это для всех этих решений несколько нелепым и в некоторых случаях больше, чем весь мой модуль, который я уже спроектировал, просто для того, чтобы вывести небольшую часть моих данных ...пример того, что я пытался сделать:

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

Это не работает (для этого потребуется 1d массив в зависимости от полученной ошибки, я не знаю, почему DataSource / GridView будет ограниченкак это), я прочитал о некоторых очень уродливых решениях, но на самом деле все, что мне нужно, это просто написать вложенный цикл for для вывода n столбцов и n строк на страницу ASP.NET.Может ли кто-нибудь помочь мне здесь (почему такая тривиальная задача должна быть такой сложной?)

Спасибо за любой отзыв =)

-Дейв

Ответы [ 3 ]

3 голосов
/ 10 августа 2010

Рассматривали ли вы просто создание собственного веб-элемента управления.Я создал быстрый, который принимает массив [,] и просто выводит содержимое массива в div с p вокруг каждого значения массива.Он простой, легкий и у вас будет полный контроль над выводом.

Вот шаг, который вам нужно реализовать:

Добавьте новый проект в ваше веб-приложение и убедитесь, что вы ссылаетесь на System.веб.Возможно, вызовите проект WebControls.

Добавьте следующий код C # в новый файл класса, который вы можете добавить в проект.

КОД ТАМОЖЕННОГО УПРАВЛЕНИЯ:

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

Теперь все, что вам нужно сделать, - это добавить недавно добавленный проект в ваше веб-приложение.свойства -> добавить ссылку - выберите проекты, а затем имя нового проекта.

Хорошо, все, что осталось - добавить объявление в верхней части страницы asp.net, чтобы вы могли ссылаться на пользовательский элемент управления, напримерследующее:

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

Теперь ссылка на элемент управления в вашем html выглядит следующим образом:

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

Хорошо, так что последний шаг - привязать элемент управления к некоторым данным в коде - что-тонапример:

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

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

А вот вывод после запуска:

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

Надеюсь, это поможет вам выйти из варенья.

Наслаждайтесь!

2 голосов
/ 10 августа 2010

не красиво, но должно дать вам начало

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

Шломо выглядит как лучшее решение, если вы не хотите массировать данные немного больше

1 голос
/ 10 августа 2010

Хотя некрасиво, ASP Nuggets в .aspx будет работать:

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

... и в коде позади:

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