2009-06-03 47 views
11

Sto cercando di associare un ASP.NET GridView di controllo per una serie string e ottengo il seguente articolo:Binding un GridView controllo ASP.NET per un array di stringhe

un campo o proprietà con il nome 'Articolo' non è stato trovato sull'origine dati selezionata .

Qual è il valore corretto che dovrei usare per la proprietà DataField dell'asp: colonna BoundField nel mio controllo GridView. Qui è il mio codice sorgente:

pagina 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> 

Codice Dietro:

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

UPDATE

ho bisogno di avere l'attributo AutoGenerateColumns impostato false perché ho bisogno di generare ulteriori asp:CommandField colonne. Ho aggiornato il mio codice di esempio per riflettere questo scenario

risposta

8

Un metodo è quello di passare una classe con un singolo campo con nome. In questo modo, puoi dargli un nome.

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

poi convertire l'array stringa in un elenco della classe

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

Ora è possibile assegnare un nome al proprietà DataField

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

Grazie, mi piace questa soluzione usando LINQ. –

+0

Come posso usare qualcosa di simile qui sopra qui: http://stackoverflow.com/questions/34209825/how- to-combine-multiple-lists-and-use-as-a-gridview-datasource Grazie – Si8

12

provare a sostituire la BoundField con un TemplateField in questo modo:

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

BTW ho sollevato questo da another question

+0

grazie. per qualche ragione non posso MAI ricordare la sintassi Container.DataItem :( –

1

Michael,

La riga di codice

<asp:BoundField DataField="Item" /> 

prevede una colonna con il nome di "Elemento", che si avrebbe se si vincolasse a uno dei controlli DataSource come SqlDataSource, ObjectDataSource o LinqDataSource. Dal momento che stai vincolando a un oggetto IEnumerable, non hai questo nome.

+0

Grazie, buon punto! Ho aggiornato il codice per usare il nome corretto –

20

Dopo ore di ricerca, ho finalmente scoperto che v'è una DataField speciale per questo caso: ""

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

spero vi aiuterà qualcuno un giorno :)

+1

Grazie, è stato utile –

+0

hmm, appena provato in una casella di selezione (menu a discesa) e non ha funzionato :(Mi chiedo se questo è specifico per GridView. Questo sembra un requisito generale così ovvio di associazione dei dati che sono davvero sorpreso che non c'è un risposta corretta – Andy

+0

Wow. Hai un link a dove hai trovato questa informazione? –

3

Qui è un esempio completo utilizzando il vecchio DataGrid ... quindi sembra che il "!" il trucco ha un'implementazione diffusa. Questo ha funzionato sotto ASP.NET in VS2008. Ovviamente, basta sostituire i nomi degli elementi giusti per usare 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> 

Così come un GridView la sezione interna sarebbe

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

Se si passa avanti e indietro, si noti che VS2008 (almeno) non può ri-dichiarare il tipo di controllo nella classe Designer.cs , quindi dovrai cambiarlo manualmente se modifichi solo i nomi degli elementi.