Привязка элемента управления ASP.NET GridView к массиву строк - PullRequest
11 голосов
/ 03 июня 2009

Я пытаюсь привязать элемент управления 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();

UPDATE

Мне нужно установить атрибут AutoGenerateColumns на false, потому что мне нужно генерировать дополнительные столбцы asp:CommandField. Я обновил пример кода, чтобы отразить этот сценарий

Ответы [ 5 ]

20 голосов
/ 21 апреля 2010

После нескольких часов поиска я наконец обнаружил, что для этого случая есть специальный DataField: "! "

<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns="false">
<Columns>
    <asp:BoundField DataField="!" />
</Columns>
</asp:GridView>

Надеюсь, однажды это кому-нибудь поможет:)

13 голосов
/ 03 июня 2009

Попробуйте заменить BoundField на TemplateField следующим образом:

<asp:TemplateField HeaderText="String Value">
        <ItemTemplate>
            <%# Container.DataItem %>
        </ItemTemplate>
    </asp:TemplateField>

Кстати, я поднял это из другой вопрос

9 голосов
/ 03 июня 2009

Один из методов - передать ему класс с одним именованным полем. Таким образом, вы можете дать ему имя.

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>
4 голосов
/ 05 декабря 2012

Вот полный пример использования старой 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, поэтому вам придется изменить это вручную, если просто редактировать имена элементов.

1 голос
/ 03 июня 2009

Michael

Строка кода

<asp:BoundField DataField="Item" />

ожидает столбец с именем «Item», который был бы у вас, если бы вы связывались с одним из элементов управления DataSource, таким как SqlDataSource, ObjectDataSource или LinqDataSource. Поскольку вы привязываетесь к IEnumerable, у вас нет такого имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...