LINQ : 사용자 정의 열 이름
-
02-07-2019 - |
문제
업데이트
기본적으로 쿼리를 winforms에 바인딩하고 있습니다 DataGridView
. 나는 열 헤더가 적절하고 필요할 때 공백이 있기를 원합니다. 예를 들어, 열 헤더가 First Name
대신에 FirstName
.
LINQ에서 자신만의 사용자 정의 열 이름을 어떻게 만드나요?
예를 들어:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
해결책 3
나는 내 자신의 문제를 해결했지만 당신의 모든 대답은 매우 도움이되었고 올바른 방향으로 나를 지적했습니다.
내 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
다른 팁
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으로 이름을 마지막으로 바꿉니다.
헤더 텍스트를 변경하려면 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
};
(Scott Nichols에서)
낙타 케이스 문자열을 읽고 각각의 새로운 자본 앞에 공간을 삽입하는 함수와 함께 (ID 등에 대한 규칙을 추가 할 수 있음). 나는 지금 나와 함께 그 기능에 대한 코드가 없지만 쓰기가 상당히 간단합니다.
결과가 열 이름에 밑줄을 긋고 템플릿 필드의 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});
다른 사람들이 이미 지적했듯이 헤더 제목 등이 설계 시간에 알려진 경우 자동 생성 된 열을 사용하는 대신자가 생성 된 열을 사용하는 대신 필드 정의에서 제목 등을 설정하십시오. 예에서 쿼리가 정적이며 제목이 설계 시간에 알려져 있으므로 아마도 최선의 선택 일 것입니다.
그러나 [질문 이이 요구 사항을 지정하지는 않지만] - 만약에 헤더 텍스트 (및 형식 등)는 다음과 같습니다 ~ 아니다 설계 시간에 알려져 있지만 런타임에 결정되며 열을 자동 생성 해야하는 경우 (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
'하자'키워드를 사용할 수 있습니다.
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