web-dev-qa-db-ja.com

LINQ:カスタム列名

[〜#〜]更新[〜#〜]

基本的には、クエリをWinForms DataGridViewにバインドしています。列ヘッダーを適切にし、必要に応じてスペースを入れたい。たとえば、列ヘッダーをFirstNameではなくFirst Nameにします。


LINQで独自のカスタム列名をどのように作成しますか?

例えば:

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

私は自分の問題を解決しましたが、あなたの答えはすべて非常に役に立ち、正しい方向に私を向けました。

私のLINQクエリでは、列名に複数の単語が含まれている場合、単語をアンダースコアで区切ります。

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

次に、PaintDataGridViewメソッド内で、ヘッダー内のすべての下線をスペースに置き換えました。

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
13
Bryan Roth

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に変更します。

26
Scott Nichols

ヘッダーテキストを変更したい場合は、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();
}
14
Scott Nichols

イベントハンドラーを追加して、これらの下線を置き換えることもできます。

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('_', ' ');
    }

}
6
woctaog

私は使うだろう:

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

(スコットニコルズから)

キャメルケースの文字列を読み取り、新しい大文字の前にスペースを挿入する関数とともに(IDなどのルールを追加できます)。今のところ、その関数のコードは持っていませんが、書くのはかなり簡単です。

4
cjk

結果の列名にアンダースコアを含め、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>
3
Mark Cidade

なぜそうしなければならないのかわかりません。グリッドなどでそうしようとしているのなら、HTMLのヘッダーに名前を付けてみませんか?

2
James Hall

実際に行うことは、変数参照を戻り値に設定することです。スペースを使用して変数に名前を付ける方法はありません。あなたがこれをしている最終結果の理由はありますか、おそらく私たちが最終的な目標を知っていれば、あなたが適切な解決策を考え出すのを助けることができます。

2

Linq拡張メソッドの使用:

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

他の人がすでに指摘しているように、ヘッダーのタイトルなどが設計時にわかっている場合は、自動生成された列を使用する代わりに、AutoGeneratedColumnsをオフにして、フィールド定義にタイトルなどを設定するだけです。あなたの例から、クエリは静的であり、タイトルは設計時にわかっているため、おそらくこれが最良の選択です。

ただし、[ただし、質問ではこの要件は指定されていません] ifヘッダーテキスト(およびフォーマットなど)はnot設計時に認識されますが、実行時に決定されます。 (AutoGenerateColumns = true "を使用して)列を自動生成する必要があります。そのための回避策があります。

これを行う1つの方法は、グリッドビューを継承する新しいコントロールクラスを作成することです。次に、グリッドビューの「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; }
    }
}
1
KristoferA

これは明示的な名前タイプを使用して実現できると思います

 system.Name,
 sysentity.Name 
 //change this to 
 entity = sysentity.Name