Pregunta

ACTUALIZAR

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


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

Por ejemplo:

Dim query = From u In db.Users _
            Select u.FirstName AS 'First Name'
¿Fue útil?

Solución 3

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

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

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

Luego, dentro del método Paint del DataGridView , reemplacé todos los guiones bajos 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

Otros consejos

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

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

Luego puedes enlazar a la consulta de variables desde arriba o recorrerla en cualquier forma ....

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

Si quisiera cambiar el nombre de las columnas, podría hacerlo, pero no se permitirían espacios.

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.

Si desea cambiar el texto del encabezado, puede configurarlo en la definición de 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 está detrás, puedes 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();
}

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

Para aquellos de ustedes que aman C #:

datagrid1.ItemDataBound += 
    new DataGridItemEventHandler(datagrid1_HeaderItemDataBound);

Y tu manejador debería verse así:

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

}

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 de Camel Case e inserta espacios antes de cada nueva capital (puede agregar reglas para la identificación, etc.). No tengo el código para esa función conmigo por ahora, pero es bastante simple de escribir.

Puede hacer que sus resultados tengan guiones bajos en el nombre de la columna y usar una plantilla de encabezado en un campo de plantilla para reemplazar los guiones bajos por espacios. O subclase el DataControlField para el GridView y anule 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>

No veo por qué tendría que hacer eso, si está intentando hacerlo para una cuadrícula o algo así, ¿por qué no nombrar simplemente el encabezado en el HTML?

Lo que realmente estaría haciendo es establecer una referencia de variable a la devolución, no hay una manera de nombrar una variable con un espacio. ¿Hay alguna razón final para que esté haciendo esto? Quizás, si conociéramos el objetivo final, podríamos ayudarlo a encontrar una solución que se ajuste.

Usando el método de extensión Linq:

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

Como ya lo han señalado otros, si el título del encabezado, etc., se conoce en el momento del diseño, desactive las columnas de generación automática y simplemente establezca el título, etc. en la definición del campo en lugar de utilizar columnas generadas automáticamente. Por 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 probablemente sea su mejor opción.

Sin embargo, [aunque su pregunta no especifica este requisito] - si el texto del encabezado (y el formato, etc.) no se conoce en el momento del diseño pero se determinará en en tiempo de ejecución y si necesita generar columnas automáticamente (utilizando AutoGenerateColumns = verdadero ") hay soluciones para eso.

Una forma de hacerlo es crear una nueva clase de control que herede la vista de cuadrícula. Luego, puede configurar el encabezado, el formato, etc. para los campos generados automáticamente al reemplazar la vista de cuadrícula " CreateAutoGeneratedColumn " 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; }
    }
}

Creo que esto se puede lograr usando un tipo de nombre explícito

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

Puedes usar la palabra clave 'let':

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

Como han mostrado otras respuestas aquí, esto no es útil. Sin embargo, la palabra clave let es útil para realizar consultas más complejas (este ejemplo está fuera de mi mente y no requiere que la palabra clave let funcione):

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

Mi VS2008 está roto ahora, así que no puedo verificarlo. En C #, usarías " = " - ¿Qué tal

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top