UPDATELINQ:自定義列名
我的查詢基本上綁定到的WinForms DataGridView
。我希望列標題適當並在需要時有空格。例如,我想要一個列標題爲First Name
而不是FirstName
。
如何在LINQ中創建自己的自定義列名?
例如:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
UPDATELINQ:自定義列名
我的查詢基本上綁定到的WinForms DataGridView
。我希望列標題適當並在需要時有空格。例如,我想要一個列標題爲First Name
而不是FirstName
。
如何在LINQ中創建自己的自定義列名?
例如:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
我解決了我自己的問題,但所有的答案都非常有幫助,並指出我在正確的方向。
在我LINQ
查詢,如果列名有超過一個的話,我會用下劃線區分開來的話:DataGridView
的Paint
方法中
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
我不明白爲什麼你就必須做到這一點,如果你正在嘗試做的,對於一個網格或東西,爲什麼不只是名稱的HTML頭?
你實際上會做的是設置一個變量引用的返回值,沒有辦法用空格來命名變量。是否有一個最終的結果是你正在做這件事的原因,也許如果我們知道了我們的最終目標,我們可以幫你提出一個適合的解決方案。
正如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。
您可以使用「讓」關鍵字:
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 };
我的VS2008是搗毀現在,所以我無法檢查。在C#中,你可以使用「=」 - 如何
Dim query = From u In db.Users _
Select 'First Name' = u.FirstName
你可以讓你的結果有下劃線的列名,並使用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>
如果你想改變標題,您可以設置在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();
}
正如其他人已經指出,如果頭題等在設計時已知,關閉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; }
}
}
我會用:
var query = from u in db.Users
select new
{
FirstName = u.FirstName,
LastName = u.LastName,
FullName = u.FirstName + " " + u.LastName
};
的ID等。(斯科特·尼科爾斯)
與讀取駱駝案例字符串,每一個新的資本之前插入空格的函數一起(你可以添加規則)。目前我還沒有用於該功能的代碼,但其編寫起來相當簡單。
更好的例子多列 – 2014-06-26 09:32:50
您還可以添加一個事件處理程序來爲您替換這些下劃線!
對於那些你們誰愛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('_', ' ');
}
}
使用LINQ擴展方法:
SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
如果你_can't check_然後請不要_answer_,直到你可以_check_ – 2017-07-20 06:08:38