У меня есть 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);
}
}