2010-11-06 8 views
0

Pourquoi j'obtiens des lignes vides sans données?Asp.net GridView n'affiche aucune donnée, juste des lignes vides


EDIT:

Maintenant, je vois mes données grâce à Phil. Je veux juste savoir deux plus petites choses:

  • quel est le DataKeyNames?
  • Comment puis-je obtenir ces données en utilisant LINQ?

Voici mon code:

<asp:GridView ID="gridProcesses" runat="server" AutoGenerateColumns="False" 
EnableModelValidation="True" Width="400px" DataKeyNames="ID"> 
    <Columns> 
     <asp:BoundField HeaderText="Name" /> 
     <asp:BoundField HeaderText="CPU" /> 
     <asp:BoundField HeaderText="RAM" /> 
     <asp:CommandField ButtonType="Button" SelectText="Kill" ShowSelectButton="True"> 
     <ItemStyle HorizontalAlign="Center" Width="30px" /> 
     </asp:CommandField> 
    </Columns> 
</asp:GridView> 
Code

derrière

public partial class OsControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    private List<string> getTestData() 
    { 
     List<string> tData = new List<string>(); 
     Random rand = new Random(); 
     for (int i = 0; i < 10; i++) 
     { 
      tData.Add("proc" + i + "_" + rand.Next(100) + "_" + rand.Next(100)); 
     } 

     return tData; 
    } 

    protected void btnLoad_Click(object sender, EventArgs e) 
    { 
     DataTable dtProcesses = new DataTable(); 
     dtProcesses.Columns.Add("Name", System.Type.GetType("System.String")); 
     dtProcesses.Columns.Add("CPU", System.Type.GetType("System.Int32")); 
     dtProcesses.Columns.Add("RAM", System.Type.GetType("System.Int32")); 
     dtProcesses.Columns.Add("ID", System.Type.GetType("System.Int32")); 

     int id = 0; 
     foreach (string line in getTestData()) 
     { 
      string[] items = line.Split('_'); 
      DataRow row = dtProcesses.NewRow(); 
      row["Name"] = items[0]; 
      row["CPU"] = int.Parse(items[1]); 
      row["RAM"] = int.Parse(items[1]); 
      row["ID"] = id++; 
      dtProcesses.Rows.Add(row); 
     } 

     gridProcesses.DataSource = dtProcesses; 
     gridProcesses.DataBind(); 
    } 
}- 

Répondre

3

Assurez-vous que vous spécifiez pas seulement le texte d'en-tête, mais aussi le champ de données:

<asp:BoundField HeaderText="Name" DataField="Name" /> 
+0

Grand, ça marche! J'ai ajouté quelques questions supplémentaires dans mon post original si vous pouviez m'aider avec eux. – Primoz

+1

@Primoz - BTW, vous pourriez envisager de changer 'System.Type.GetType (" System.String ")' à 'typeof (string)'. Est plus propre et ajoute les avantages de la vérification de "faute de frappe" à la compilation que vous n'obtenez pas avec des chaînes codées en dur. –

+0

Vous avez manqué 'DataField =" Name "' dans ''. Il devrait être '' (Il est en fait dans la réponse de Phil Hunt). – a1ex07

1

Réponses aux questions mises à jour:

Qu'est-ce que DataKeyNames?

Cette propriété obtient ou définit les champs de clé primaire pour les éléments affichés dans la GridView:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspx

Comment puis-je obtenir ces données en utilisant LINQ?

Si vous utilisez LINQ, vous pensez probablement à LINQ to Entities (Entity Framework). La description EF en détail est un peu grand pour le cadre d'une réponse, mais cela devrait vous aider à démarrer avec EF à databinding:

http://learnentityframework.com/LearnEntityFramework/tutorials/asp-net-databinding-with-linq-to-entities/

+0

J'ai ajouté screenshoot pour ce que je veux avec LINQ. – Primoz