문제

업데이트

기본적으로 쿼리를 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top