19

更新

我基本上将查询绑定到 WinForms DataGridView。我希望列标题合适,并在需要时有空格。例如,我想要一个列标题First Name而不是FirstName.


如何在 LINQ 中创建自己的自定义列名?

例如:

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

12 回答 12

29

正如 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。

于 2008-09-24T17:03:51.950 回答
16

我解决了自己的问题,但是您的所有答案都非常有帮助,并为我指明了正确的方向。

在我的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
于 2009-01-14T15:55:53.463 回答
15

如果要更改标题文本,可以在 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();
}
于 2008-09-24T18:26:49.690 回答
6

您还可以添加一个事件处理程序来为您替换那些下划线!

对于那些喜欢 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('_', ' ');
    }

}
于 2009-01-28T01:09:53.833 回答
4

我会使用:

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

(来自斯科特尼科尔斯)

以及一个读取骆驼大小写字符串并在每个新大写字母之前插入空格的函数(您可以为 ID 等添加规则)。我现在没有那个函数的代码,但是写起来相当简单。

于 2009-01-08T18:01:06.513 回答
3

您可以使结果在列名中包含下划线,并在 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>
于 2008-09-24T18:16:19.827 回答
2

我不明白为什么你必须这样做,如果你试图为网格或其他东西这样做,为什么不直接在 HTML 中命名标题?

于 2008-09-24T16:44:08.190 回答
2

您实际上要做的是设置对返回的变量引用,没有办法用空格命名变量。您这样做是否有最终结果的原因,也许如果我们知道最终目标,我们可以帮助您提出适合的解决方案。

于 2008-09-24T16:52:17.623 回答
2

使用 Linq 扩展方法:

SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
于 2014-11-19T16:32:07.387 回答
1

正如其他人已经指出的那样,如果在设计时已知标题等,请关闭 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; }
    }
}
于 2008-09-25T03:26:19.177 回答
0

我相信这可以使用显式名称类型来实现

 system.Name,
 sysentity.Name 
 //change this to 
 entity = sysentity.Name
于 2018-05-23T10:11:21.303 回答
-8

我的VS2008现在坏了,所以我无法检查。在 C# 中,您将使用“=” - 怎么样

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
于 2008-09-24T17:41:58.957 回答