2008-09-24 69 views
14

UPDATELINQ:自定義列名

我的查詢基本上綁定到的WinForms DataGridView。我希望列標題適當並在需要時有空格。例如,我想要一個列標題爲First Name而不是FirstName


如何在LINQ中創建自己的自定義列名?

例如:

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

回答

8

我解決了我自己的問題,但所有的答案都非常有幫助,並指出我在正確的方向。

在我LINQ查詢,如果列名有超過一個的話,我會用下劃線區分開來的話:DataGridViewPaint方法中

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

然後,我取代中的所有下劃線標題與空間:

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 
2

我不明白爲什麼你就必須做到這一點,如果你正在嘗試做的,對於一個網格或東西,爲什麼不只是名稱的HTML頭?

2

你實際上會做的是設置一個變量引用的返回值,沒有辦法用空格來命名變量。是否有一個最終的結果是你正在做這件事的原因,也許如果我們知道了我們的最終目標,我們可以幫你提出一個適合的解決方案。

23

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

-1

您可以使用「讓」關鍵字:

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

至於其他的答案在這裏已經表明,這是沒有用的。然而,let關鍵字是做更復雜的查詢有用的(這個例子是把我的頭頂部,不需要let關鍵字工作):

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

我的VS2008是搗毀現在,所以我無法檢查。在C#中,你可以使用「=」 - 如何

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

如果你_can't check_然後請不要_answer_,直到你可以_check_ – 2017-07-20 06:08:38

3

你可以讓你的結果有下劃線的列名,並使用HeaderTemplate中的一個TemplateField用空格來代替下劃線。或子類的DataControlField爲GridView和覆蓋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> 
14

如果你想改變標題,您可以設置在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(); 
} 
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; } 
    } 
} 
4

我會用:

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

的ID等。(斯科特·尼科爾斯)

與讀取駱駝案例字符串,每一個新的資本之前插入空格的函數一起(你可以添加規則)。目前我還沒有用於該功能的代碼,但其編寫起來相當簡單。

+0

更好的例子多列 – 2014-06-26 09:32:50

5

您還可以添加一個事件處理程序來爲您替換這些下劃線!

對於那些你們誰愛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('_', ' '); 
    } 

} 
2

使用LINQ擴展方法:

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