更新
我基本上将查询绑定到 WinForms DataGridView
。我希望列标题合适,并在需要时有空格。例如,我想要一个列标题First Name
而不是FirstName
.
如何在 LINQ 中创建自己的自定义列名?
例如:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
更新
我基本上将查询绑定到 WinForms DataGridView
。我希望列标题合适,并在需要时有空格。例如,我想要一个列标题First Name
而不是FirstName
.
如何在 LINQ 中创建自己的自定义列名?
例如:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
正如 CQ 所说,您不能为字段名称留出空格,但是您可以返回新列。
var query = from u in db.Users
select new
{
FirstName = u.FirstName,
LastName = u.LastName,
FullName = u.FirstName + " " + u.LastName
};
然后你可以从上面绑定到变量查询或循环遍历它......
foreach (var u in query)
{
// Full name will be available now
Debug.Print(u.FullName);
}
如果您想重命名列,可以,但不允许使用空格。
var query = from u in db.Users
select new
{
First = u.FirstName,
Last = u.LastName
};
将 FirstName 重命名为 First,LastName 重命名为 Last。
我解决了自己的问题,但是您的所有答案都非常有帮助,并为我指明了正确的方向。
在我的LINQ
查询中,如果列名有多个单词,我会用下划线分隔单词:
Dim query = From u In Users _
Select First_Name = u.FirstName
然后,在 的Paint
方法中DataGridView
,我用空格替换了标题中的所有下划线:
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
如果要更改标题文本,可以在 GridView 定义中进行设置...
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="First Name" />
</Columns>
</asp:GridView>
在后面的代码中,您可以绑定到用户,它将标头设置为名字。
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();
}
您还可以添加一个事件处理程序来为您替换那些下划线!
对于那些喜欢 C# 的人:
datagrid1.ItemDataBound +=
new DataGridItemEventHandler(datagrid1_HeaderItemDataBound);
您的处理程序应如下所示:
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('_', ' ');
}
}
我会使用:
var query = from u in db.Users
select new
{
FirstName = u.FirstName,
LastName = u.LastName,
FullName = u.FirstName + " " + u.LastName
};
(来自斯科特尼科尔斯)
以及一个读取骆驼大小写字符串并在每个新大写字母之前插入空格的函数(您可以为 ID 等添加规则)。我现在没有那个函数的代码,但是写起来相当简单。
您可以使结果在列名中包含下划线,并在 TemplateField 中使用 HeaderTemplate 将下划线替换为空格。或者子类化 GridView 的 DataControlField 并覆盖 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>
我不明白为什么你必须这样做,如果你试图为网格或其他东西这样做,为什么不直接在 HTML 中命名标题?
您实际上要做的是设置对返回的变量引用,没有办法用空格命名变量。您这样做是否有最终结果的原因,也许如果我们知道最终目标,我们可以帮助您提出适合的解决方案。
使用 Linq 扩展方法:
SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
正如其他人已经指出的那样,如果在设计时已知标题等,请关闭 AutoGeneratedColumns 并在字段定义中设置标题等,而不是使用自动生成的列。从您的示例看来,查询是静态的,并且标题在设计时是已知的,因此这可能是您的最佳选择。
但是[,尽管您的问题没有指定此要求] -如果标题文本(和格式等)在设计时未知,但将在运行时确定,并且您需要自动生成列(使用 AutoGenerateColumns=true")是解决方法。
一种方法是创建一个继承gridview 的新控件类。然后,您可以通过覆盖 gridview 的“CreateAutoGeneratedColumn”来为自动生成的字段设置标题、格式等。例子:
//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; }
}
}
我相信这可以使用显式名称类型来实现
system.Name,
sysentity.Name
//change this to
entity = sysentity.Name
我的VS2008现在坏了,所以我无法检查。在 C# 中,您将使用“=” - 怎么样
Dim query = From u In db.Users _
Select 'First Name' = u.FirstName