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.