Связывание элемента управления GridView ASP.NET с массивом строк
Я пытаюсь привязать элемент управления ASP.NET GridView
к массиву string
, и я получаю следующий элемент:
Поле или свойство с именем "Элемент" не найден на выбранном источника данных.
Какое правильное значение я должен использовать для свойства DataField столбца asp: BoundField в элементе управления GridView. Вот мой исходный код:
Страница ASPX
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Item" />
<asp:CommandField ButtonType="Link" ShowSelectButton="true" SelectText="Click Me!" />
</Columns>
</asp:GridView>
Код за:
string[] MyArray = new string[1];
MyArray[0] = "My Value";
MyGridView.DataSource = MyArray;
MyGridView.DataBind();
ОБНОВЛЕНИЕ
Мне нужно установить атрибут AutoGenerateColumns
на false
, потому что мне нужно создать дополнительные столбцы asp:CommandField
. Я обновил свой пример кода, чтобы отразить этот сценарий
Ответы
Ответ 1
Один из методов - передать ему класс с одним именованным полем. Таким образом, вы можете дать ему имя.
public class GridRecord
{
public string MyValue { get; set; }
}
Затем преобразуйте свой строковый массив в список класса
string[] MyArray = new string[1];
MyArray[0] = "My Value";
List<GridRecord> MyList = (
from ar in myArray
select new GridRecord
{
MyValue = ar
}).ToList();
MyGridView.DataSource = MyList;
MyGridView.DataBind();
Теперь вы можете назвать свой Свойство DataField
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="MyValue" />
</Columns>
</asp:GridView>
Ответ 2
После нескольких часов поиска я наконец обнаружил, что для этого случая есть специальный DataField: "!"
<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="!" />
</Columns>
</asp:GridView>
Я надеюсь, что когда-нибудь это поможет кому-то:)
Ответ 3
Попробуйте заменить BoundField на TemplateField следующим образом:
<asp:TemplateField HeaderText="String Value">
<ItemTemplate>
<%# Container.DataItem %>
</ItemTemplate>
</asp:TemplateField>
BTW Я снял это с еще один вопрос
Ответ 4
Вот полный пример использования старого DataGrid... так что кажется, что "!" трюк широко распространен. Это работало под ASP.NET в VS2008. Конечно, просто замените имена правых элементов на использование GridView.
<%@ Page
Language="C#"
AutoEventWireup="true"
CodeBehind="Default.aspx.cs"
Inherits="WebApplication2._Default"
%>
<%@Import
Namespace="System.Collections.Generic"
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script type="text/C#" runat="server">
void initList()
{
List<String> myList = new List<String>();
myList.Add("Hello");
myList.Add("Chatting");
myList.Add("Goodbye");
Grid1.DataSource = myList;
Grid1.DataBind();
}
</script>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<%initList(); %>
<asp:DataGrid runat="server" ID="Grid1" AutoGenerateColumns="false">
<Columns>
<asp:BoundColumn DataField="!" DataFormatString="Data: {0}" HeaderText="Dyad"/>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
Итак, в качестве GridView внутренний раздел будет
<asp:GridView runat="server" ID="Grid1" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="!" DataFormatString="Data: {0}" HeaderText="Dyad"/>
</Columns>
</asp:GridView>
Если вы переключаетесь назад и вперед, обратите внимание, что VS2008 (по крайней мере) не может повторно объявить тип элемента управления в классе Designer.cs, поэтому вам придется изменить это вручную, только редактируя имена элементов.
Ответ 5
Майкл
Строка кода
<asp:BoundField DataField="Item" />
ожидает столбец с именем "Item", который вы бы имели, если бы вы были привязаны к одному из элементов управления DataSource, таких как SqlDataSource, ObjectDataSource или LinqDataSource. Поскольку вы привязываетесь к IEnumerable, у вас нет такого имени.