una tag tabla route paginacion net mvc mostrar filtros filtro datos data busqueda asp all asp.net linq linq-to-sql datagridview

asp.net - tag - LINQ: nombres de columna personalizados



paginacion mvc razor (12)

ACTUALIZAR

Básicamente estoy vinculando la consulta a 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 sea First Name 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''


¡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 su controlador debe 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(''_'', '' ''); } }


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

Luego puede vincularse a la consulta variable desde arriba o recorrerla, sea lo que sea ...

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án 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.


Como otros ya han señalado, si se conoce el título del encabezado, etc. en tiempo de diseño, apague AutoGeneratedColumns y simplemente establezca el título, etc., en la definición del campo en lugar de usar 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 especifique este requisito] - si el texto del encabezado (y formato, etc.) no se conoce en tiempo de diseño pero se determinará en tiempo de ejecución y si necesita generar columnas automáticamente (utilizando AutoGenerateColumns = true ") allí son soluciones para eso.

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


Lo que realmente estaría haciendo es establecer una referencia de 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?


Mi VS2008 está roto en este momento, por lo que no puedo verificar. En C #, usaría "=" - ¿Qué tal

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


No veo por qué tendrías que hacer eso, si estás tratando de hacer eso para una grilla o algo así, ¿por qué no solo nombras el encabezado en el HTML?


Puede hacer que sus resultados tengan guiones bajos en el nombre de la columna y usar un HeaderTemplate en un TemplateField para reemplazar guiones bajos con espacios. O subclase el DataControlField para 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>


Puede usar la palabra clave ''let'':

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 hacer consultas más complejas (este ejemplo está fuera de mi cabeza 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 };


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

En mi consulta LINQ , si el nombre de una columna tiene 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 de 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


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


Usando el método de extensión de Linq:

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


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 nuevo capital (puede agregar reglas para ID, etc.). No tengo el código para esa función conmigo por el momento, pero es bastante simple de escribir.