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

У меня есть строковый массив 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. Может ли кто-нибудь помочь мне здесь (почему такая тривиальная задача должна быть такой сложной?)

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

-Dave

3 ответа

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

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

Добавьте новый проект в ваше веб-приложение и убедитесь, что вы ссылаетесь на System.web. Возможно, позвоните в проект 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> 

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

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

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

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

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

Хотя и некрасиво, ASP Code 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);
        }
    }
Другие вопросы по тегам