2009-01-06 5 views
1

J'utilise une liste d'objets en tant que source de données de mon GridView et lorsque les colonnes ne sont pas visibles, les mises à jour échouent car la valeur de ces colonnes est modifié en null (et la colonne n'autorise pas les valeurs NULL). Les valeurs existent quand les colonnes sont visibles mais je ne veux vraiment pas afficher ces colonnes car, pour la plupart, ce sont des colonnes d'ID que l'utilisateur n'a pas vraiment besoin de voir.ASP.NET: valeur GridView définie sur null lorsque la colonne n'est pas visible

EDIT: J'ai essayé l'option de champ masqué mais elle définit toujours la valeur sur null. J'ai regardé la source de page et le champ caché existe avec la valeur appropriée ...

+0

De toute façon vous pouvez nous donner du code, à la fois votre GridView et votre code? –

Répondre

3

J'ai trouvé cette solution pour simuler les colonnes cachées dans .Net 2.0:

implémentez l'événement GridView.RowCreated.

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    e.Row.Cells[1].Visible = false; 
    e.Row.Cells[2].Visible = false; 
} 

Voici le lien: http://www.beansoftware.com/ASP.NET-Tutorials/GridView-Hidden-Column.aspx

Je suppose que dans la version 2.0 quand une colonne est pas visible la liaison de données échoue pour cette colonne, mais cette méthode se cache après que le lien a été établi de sorte qu'il trompe le système (?).

0

Si vous ne le faites pas déjà, je considérerais employer des colonnes de modèle pour vos données et faisiez la liaison de données "manuelle" (soit "en ligne" ou dans le code derrière la page en utilisant l'événement RowDataBound). De cette façon, vous pouvez tester DBNull et simplement ignorer de mettre une valeur dans la colonne si la valeur est NULL. Cela permettra également aux colonnes d'être correctement cachées.

+0

Voulez-vous dire que si une colonne est invisible, sa valeur par défaut est null? –

+0

Non, je dis que la "liaison automatique" attend une valeur et si elle rencontre DBNull, elle vous donnera le problème que vous rencontrez. Il semble que la liaison de données tente de se produire même si la colonne est invisible. Avoir la liaison "manuelle" permettra toujours à la liaison de se produire, juste w/pas de données. –

+0

Les données ne sont pas DBNull, mais lorsqu'elles sont mises à jour, les valeurs sont nulles lorsqu'elles ne sont pas visibles (c'est la même chose avec les champs masqués). –

0

Vous pouvez le faire avec des champs cachés pour les valeurs que vous ne voulez pas afficher. De cette façon, vous pouvez toujours utiliser la même liaison de données et d'autres fonctions que vous faites aujourd'hui.

1

Microsoft recommends using the DataKeyNames property du contrôle GridView.

Au lieu d'utiliser le code-behind pour masquer certaines colonnes, vous pouvez simplement supprimer les champs liés de la GridView et les spécifier dans la propriété DataKeyNames:

<asp:GridView ID="GridView1" runat="server" 
     DataKeyNames="SalesOrderID,SalesOrderDetailID" 
     DataSourceID="LinqDataSource1"> 

De cette façon, les champs ne seront pas montrer à l'utilisateur mais le GridView sait garder les valeurs autour pour la mise à jour, etc.

0

Quand un champ dans GridView est rendu invisible, ses valeurs de cellules ne sont pas plus accessibles ou elles sont nulles ou vides. Pour résoudre ce problème, il suffit d'assigner des noms de colonnes (champs masqués) à la propriété DataKeyNames de GridView en faisant DataKeyNames="colName1,colName2,colName3".

ensuite accéder à leurs valeurs de cellules comme cellValue = GridView1.DataKeys[0]["ID"].ToString();

J'ai écrit un simple post démontrant la solution à votre problème à here.