2008-09-24 60 views
14

ACTUALIZACIÓNLINQ: nombres de columna personalizados

básicamente estoy vinculante la consulta a un WinForms DataGridView. Quiero que los encabezados de columna sean apropiados y tengan espacios cuando sea necesario. Por ejemplo, me gustaría que un encabezado de columna fuera First Name en lugar de FirstName.


¿Cómo se crean sus propios nombres de columna personalizados en LINQ?

Por ejemplo:

Dim query = From u In db.Users _ 
      Select u.FirstName AS 'First Name' 

Respuesta

8

Resolví mi propio problema pero todas sus respuestas fueron muy útiles y me orientaron en la dirección correcta.

En mi LINQ consulta, si un nombre de columna tenía más de una palabra que separar las palabras con un guión:

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

Luego, en el método de la DataGridViewPaint, me reemplazado todo pone de relieve dentro del encabezado con un espacio:

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 
2

No veo por qué tendría que hacer eso, si usted está tratando de hacer eso por una rejilla o algo así, ¿por qué no sólo el nombre de la cabecera en el código HTML?

2

Lo que en realidad estarías haciendo es establecer una referencia variable para el retorno, no hay forma de nombrar una variable con un espacio. ¿Hay algún motivo de resultado final por el que está haciendo esto, tal vez si supiéramos cuál es el objetivo final, podríamos ayudarlo a encontrar la solución adecuada?

23

Como afirma CQ, no puede tener espacio para el nombre del campo, sin embargo, puede devolver columnas nuevas.

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

A continuación, se puede unir a la consulta variables desde arriba o de bucle a través de él lo que sea ....

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

Si desea cambiar el nombre de las columnas, se puede, pero los espacios no habría permitido.

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

Cambiaría el nombre de FirstName a First y LastName a Last.

-1

Usted puede utilizar el 'dejar' palabra clave:

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

Como otras respuestas aquí han demostrado, esto no es útil. Sin embargo, la palabra clave let es útil para realizar consultas más complejas (este ejemplo es de la parte superior de mi cabeza y no requiere la palabra clave let a trabajar):

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

Mi VS2008 es arrestado en este momento, por lo que no puedo verificar En C#, se usaría "=" - ¿Qué hay de

Dim query = From u In db.Users _ 
      Select 'First Name' = u.FirstName 
+0

si _can't check_ entonces no responda _answer_ hasta que pueda _check_ –

3

Puede hacer que sus resultados tienen guiones en el nombre de la columna y utilizar un HeaderTemplate en un TemplateField para reemplazar subrayado con espacios. O subclase el DataControlField para el GridView y reemplazar la propiedad 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> 
14

Si desea cambiar el texto del encabezado, puede establecer que en la definición GridView ...

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

En el código que se encuentra detrás, puede enlazar a los usuarios y establecerá el encabezado en Nombre.

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

Como otros ya han señalado, si el título de cabecera, etc se conoce en tiempo de diseño, desactive AutoGeneratedColumns y simplemente establecer el título, etc en la definición de campo en lugar de utilizar columnas generadas automáticamente. A partir de su ejemplo, parece que la consulta es estática y que los títulos se conocen en el momento del diseño, por lo que es probablemente su mejor opción.

Sin embargo [, aunque su pregunta no especifica este requisito] - si el texto de cabecera (y el formato, etc) es no conocido en tiempo de diseño, pero será determinado en tiempo de ejecución y si es necesario para auto generar columnas (usando AutoGenerateColumns = verdadera ") hay soluciones para ello.

una forma de hacerlo es crear una nueva clase de control que hereda el gridview. a continuación, puede establecer la cabecera, el formato, etc para el auto campos generados por anulando el "CreateAutoGeneratedColumn" de gridview. Ejemplo:

//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; } 
    } 
} 
4

yo usaría:

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

(de Scott Nichols)

junto con una función que lee una cadena Camel Case e inserta espacios antes de cada nueva capital (se puede añadir reglas para la Identificación etc.) No tengo el código para esa función conmigo por el momento, pero es bastante simple de escribir.

+0

Mejor ejemplo para múltiples columnas –

5

¡También puede agregar un controlador de eventos para reemplazar esos guiones bajos por usted!

Para aquellos de ustedes que aman C#:

datagrid1.ItemDataBound += 
    new DataGridItemEventHandler(datagrid1_HeaderItemDataBound); 

Y el controlador debe tener este aspecto:

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('_', ' '); 
    } 

} 
2

Usando LINQ Método de extensión:

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