Question

MISE À JOUR

En gros, je lie la requête à un DataGridView de WinForms. Je veux que les en-têtes de colonne soient appropriés et disposent d'espaces en cas de besoin. Par exemple, je voudrais qu'un en-tête de colonne soit Prénom au lieu de Prénom .

Comment créez-vous vos propres noms de colonne personnalisés dans LINQ?

Par exemple:

Dim query = From u In db.Users _
            Select u.FirstName AS 'First Name'
Était-ce utile?

La solution 3

J'ai résolu mon propre problème, mais toutes vos réponses ont été très utiles et m'ont orientée dans la bonne direction.

Dans ma requête LINQ , si un nom de colonne comportait plus d'un mot, je les séparerais par un trait de soulignement:

Dim query = From u In Users _
            Select First_Name = u.FirstName

Ensuite, dans la méthode Paint de DataGridView , j'ai remplacé tous les traits de soulignement dans l'en-tête par un espace:

Private Sub DataGridView1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGridView1.Paint
    For Each c As DataGridViewColumn In DataGridView1.Columns
        c.HeaderText = c.HeaderText.Replace("_", " ")
    Next
End Sub

Autres conseils

Comme CQ l'indique, vous ne pouvez pas laisser d'espace pour le nom du champ, vous pouvez cependant renvoyer de nouvelles colonnes.

var query = from u in db.Users
            select new
            {
                FirstName = u.FirstName,
                LastName = u.LastName,
                FullName = u.FirstName + " " + u.LastName
            };

Ensuite, vous pouvez créer un lien vers la requête de variable d'en haut ou le parcourir de quelque manière que ce soit ....

foreach (var u in query)
{
   // Full name will be available now 
   Debug.Print(u.FullName); 
}

Si vous souhaitez renommer les colonnes, vous pouvez le faire, mais les espaces ne seraient pas autorisés.

var query = from u in db.Users
            select new
            {
                First = u.FirstName,
                Last = u.LastName
            };

Renomme le prénom en prénom et le nom en dernier.

Si vous souhaitez modifier le texte de l'en-tête, vous pouvez le définir dans la définition de GridView ...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
    </Columns>
</asp:GridView>

Dans le code, vous pouvez créer un lien avec les utilisateurs et définir l'en-tête sur Prénom.

protected void Page_Load(object sender, EventArgs e)
{
     // initialize db datacontext
     var query = from u in db.Users
                 select u;
     GridView1.DataSource = query;
     GridView1.DataBind();
}

Vous pouvez également ajouter un gestionnaire d'événements pour remplacer les traits de soulignement pour vous!

Pour ceux d'entre vous qui aiment le C #:

datagrid1.ItemDataBound += 
    new DataGridItemEventHandler(datagrid1_HeaderItemDataBound);

Et votre gestionnaire devrait ressembler à ceci:

private void datagrid1_HeaderItemDataBound(object sender, DataGridItemEventArgs e)
{

    if (e.Item.ItemType == ListItemType.Header)
    {
        foreach(TableCell cell in e.Item.Cells)
            cell.Text = cell.Text.Replace('_', ' ');
    }

}

Je voudrais utiliser:

var query = from u in db.Users
            select new
            {
                FirstName = u.FirstName,
                LastName = u.LastName,
                FullName = u.FirstName + " " + u.LastName
            };

(de Scott Nichols)

avec une fonction qui lit une chaîne de cas Camel et insère des espaces avant chaque nouvelle capitale (vous pouvez ajouter des règles pour l'ID, etc.). Je n'ai pas le code pour cette fonction avec moi pour le moment, mais c'est assez simple à écrire.

Vous pouvez définir des traits de soulignement dans le nom de la colonne de vos résultats et utiliser un modèle HeaderTemplate dans un champ TemplateField pour remplacer les traits de soulignement par des espaces. Ou sous-classez le DataControlField pour le GridView et remplacez la propriété HeaderText:

namespace MyControls 
{
public SpacedHeaderTextField : System.Web.UI.WebControls.BoundField
 { public override string HeaderText
    { get 
       { string value = base.HeaderText;
         return (value.Length > 0) ? value : DataField.Replace(" ","");
       }
      set
       { base.HeaderText = value;
       }     
    }
 } 
 }

ASPX:

<%@Register TagPrefix="my" Namespace="MyControls" %>

<asp:GridView DataSourceID="LinqDataSource1" runat='server'>
  <Columns>
     <my:SpacedHeaderTextField DataField="First_Name" />
  </Columns>
</asp:GridView>

Je ne vois pas pourquoi vous devriez le faire. Si vous essayez de le faire pour une grille, pourquoi ne pas simplement nommer l'en-tête dans le code HTML?

Ce que vous feriez réellement est de définir une référence de variable au retour, il n’existe pas de moyen de nommer une variable avec un espace. Y a-t-il une raison ultime pour laquelle vous faites cela? Peut-être que si nous connaissions l'objectif ultime, nous pourrions vous aider à trouver une solution qui vous convient.

Utilisation de la méthode d'extension Linq:

SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});

Comme d'autres l'ont déjà fait remarquer, si le titre de l'en-tête, etc., est connu au moment de la conception, désactivez AutoGeneratedColumns et définissez simplement le titre, etc. dans la définition du champ au lieu d'utiliser des colonnes générées automatiquement. D'après votre exemple, il semble que la requête soit statique et que les titres soient connus au moment de la conception. C'est donc probablement votre meilleur choix.

Cependant [, bien que votre question ne spécifie pas cette exigence] - si le texte de l'en-tête (et le formatage, etc.) n'est pas connu au moment de la conception, mais sera déterminé à runtime et si vous devez générer automatiquement des colonnes (à l’aide de AutoGenerateColumns = vrai "), il existe des solutions de contournement pour cela.

Une façon de faire est de créer une nouvelle classe de contrôle qui hérite de la vue en grille. Vous pouvez ensuite définir un en-tête, un formatage, etc. pour les champs générés automatiquement en remplaçant l'option "CreateAutoGeneratedColumn" de la grille de visualisation. Exemple:

//gridview with more formatting options
namespace GridViewCF
{
    [ToolboxData("<{0}:GridViewCF runat=server></{0}:GridViewCF>")]
    public class GridViewCF : GridView
    {
        //public Dictionary<string, UserReportField> _fieldProperties = null;

        public GridViewCF()
        {
        }

        public List<FieldProperties> FieldProperties
        {
            get
            {
                return (List<FieldProperties>)ViewState["FieldProperties"];
            }
            set
            {
                ViewState["FieldProperties"] = value;
            }
        }

        protected override AutoGeneratedField CreateAutoGeneratedColumn(AutoGeneratedFieldProperties fieldProperties)
        {
            AutoGeneratedField field = base.CreateAutoGeneratedColumn(fieldProperties);
            StateBag sb = (StateBag)field.GetType()
                .InvokeMember("ViewState",
                BindingFlags.GetProperty |
                BindingFlags.NonPublic |
                BindingFlags.Instance,
                null, field, new object[] {});

            if (FieldProperties != null)
            {
                FieldProperties fps = FieldProperties.Where(fp => fp.Name == fieldProperties.Name).Single();
                if (fps.FormatString != null && fps.FormatString != "")
                {
                    //formatting
                    sb["DataFormatString"] = "{0:" + fps.FormatString + "}";
                    field.HtmlEncode = false;
                }

                //header caption
                field.HeaderText = fps.HeaderText;

                //alignment
                field.ItemStyle.HorizontalAlign = fps.HorizontalAlign;
            }

            return field;
       }
    }

    [Serializable()]
    public class FieldProperties
    {
        public FieldProperties()
        { }

        public FieldProperties(string name, string formatString, string headerText, HorizontalAlign horizontalAlign)
        {
            Name = name;
            FormatString = formatString;
            HeaderText = headerText;
            HorizontalAlign = horizontalAlign;
        }

        public string Name { get; set; }
        public string FormatString { get; set; }
        public string HeaderText { get; set; }
        public HorizontalAlign HorizontalAlign { get; set; }
    }
}

Je pense que cela peut être réalisé en utilisant un type de nom explicite

 system.Name,
 sysentity.Name 
 //change this to 
 entity = sysentity.Name

Vous pouvez utiliser le mot clé 'let':

Dim query = From u In db.Users _
            let First_Name = u.FirstName
            Select First_Name

Comme d'autres réponses l'ont montré, ce n'est pas utile. Cependant, le mot-clé let est utile pour effectuer des requêtes plus complexes (cet exemple me vient à l’esprit et ne nécessite pas le mot-clé let pour fonctionner):

from x in dc.Users 
let match = regex.Match(".*ass.*", x.Name) 
let comment = match ? "*snicker*" : "sup"
select new { Name = x.Name, Comment = comment };

Mon VS2008 est en panne, je ne peux donc pas vérifier. En C #, vous utiliseriez " = " - Que diriez-vous de

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top