2009-06-03 24 views
11

Estoy tratando de enlazar un control de ASP.NET GridView a un array string y me sale el siguiente punto:Enlazar un control GridView ASP.NET a una matriz de cadenas

un campo o propiedad con el nombre No se encontró 'Elemento' en la fuente de datos seleccionada.

Cuál es el valor correcto que debo usar para la propiedad DataField de la columna asp: BoundField en mi control GridView. Aquí está mi código fuente:

página 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> 

código subyacente:

string[] MyArray = new string[1]; 
MyArray[0] = "My Value"; 
MyGridView.DataSource = MyArray; 
MyGridView.DataBind(); 

ACTUALIZACIÓN

Necesito tener el atributo AutoGenerateColumns establece en false porque necesito generar columnas adicionales asp:CommandField. He actualizado mi ejemplo de código para reflejar este escenario

Respuesta

8

Un método consiste en pasar una clase con un solo campo con nombre. De esa forma, puedes darle un nombre.

public class GridRecord 
{ 
    public string MyValue { get; set; } 
} 

luego convertir su matriz de cadenas a una lista de la clase

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

Ahora usted puede nombrar a su propiedad DataField

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

Gracias, me gusta esta solución usando LINQ. –

+0

¿Cómo puedo usar algo como el anterior aquí ?: http://stackoverflow.com/questions/34209825/how- to-combine-multiple-lists-and-use-as-a-gridview-datasource Gracias. – Si8

12

sustituya el BoundField con un TemplateField así:

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

Por cierto Levanté esto desde another question

+0

gracias. por alguna razón, NUNCA puedo recordar la sintaxis de Container.DataItem :( –

1

Michael,

La línea de código

<asp:BoundField DataField="Item" /> 

espera una columna con el nombre de "Elemento", que tendría si estuviera vinculando a uno de los controles de DataSource como SqlDataSource, ObjectDataSource o LinqDataSource. Como está vinculado a un IEnumerable, no tiene ese nombre.

+0

Gracias, buen punto! He actualizado el código para usar el nombre correcto. –

20

Después de horas de búsqueda, finalmente encontré que hay una DataField especial para este caso: "! "

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

espero que va a ayudar a alguien un día :)

+1

Gracias, fue útil. –

+0

hmm, Acabo de probarlo en un cuadro de selección (menú desplegable) y no funcionó :(Me pregunto si eso es específico de GridView. Esto parece un requisito general tan obvio de enlace de datos que estoy realmente sorprendido de que no haya un respuesta correcta – Andy

+0

Wow. ¿Tiene un enlace al lugar donde encontró esta información? –

3

Aquí es un ejemplo completo que usa el antiguo DataGrid ... por lo que parece que el "!" truco tiene una implementación generalizada. Esto funcionó en ASP.NET en VS2008. Por supuesto, simplemente sustituya los nombres de elementos correctos para usar un 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> 

Así como GridView la sección interior habría

<asp:GridView runat="server" ID="Grid1" AutoGenerateColumns="false"> 
     <Columns> 
      <asp:BoundField DataField="!" DataFormatString="Data: {0}" HeaderText="Dyad"/> 
     </Columns> 
    </asp:GridView> 

Si cambia de un lado a otro, observe que VS2008 (al menos) no puede volver a declarar el tipo de control en la clase Designer.cs , entonces tendrá que cambiar eso a mano si solo está editando los nombres de los elementos.

Cuestiones relacionadas