アップデート
私は基本的にクエリを WinForms にバインドしていますDataGridView
。列ヘッダーが適切で、必要に応じてスペースが必要です。たとえば、列ヘッダーFirst Name
をFirstName
.
LINQ で独自のカスタム列名を作成するにはどうすればよいですか?
例えば:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
アップデート
私は基本的にクエリを WinForms にバインドしていますDataGridView
。列ヘッダーが適切で、必要に応じてスペースが必要です。たとえば、列ヘッダーFirst Name
をFirstName
.
LINQ で独自のカスタム列名を作成するにはどうすればよいですか?
例えば:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
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 に名前変更します。
私は自分の問題を解決しましたが、あなたの答えはすべて非常に役に立ち、正しい方向に私を向けてくれました.
私の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
ヘッダー テキストを変更する場合は、GridView 定義で設定できます...
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="First Name" />
</Columns>
</asp:GridView>
コード ビハインドでは、ユーザーにバインドでき、ヘッダーを First Name に設定します。
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
};
(スコット・ニコルズより)
キャメルケースの文字列を読み取り、新しい大文字の前にスペースを挿入する関数 (ID などのルールを追加できます) とともに。今のところ、その関数のコードは持っていませんが、書くのはかなり簡単です。
結果の列名にアンダースコアを含め、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>
なぜそれをしなければならないのかわかりません.グリッドなどでそれをしようとしているのなら、HTMLでヘッダーに名前を付けてみませんか?
実際に行うことは、戻り値への変数参照を設定することです。変数にスペースを付けて名前を付ける方法はありません。あなたがこれを行っている最終結果の理由はありますか?おそらく、最終的な目標を知っていれば、適切な解決策を考え出すのに役立ちます.
他の人がすでに指摘しているように、設計時にヘッダーのタイトルなどがわかっている場合は、AutoGeneratedColumns をオフにして、自動生成された列を使用する代わりにフィールド定義にタイトルなどを設定してください。あなたの例から、クエリは静的であり、タイトルは設計時にわかっているように見えるので、おそらくそれが最良の選択です。
ただし、[、質問ではこの要件が指定されていませんが]-ヘッダーテキスト(およびフォーマットなど)が設計時に不明であるが、実行時に決定される場合、および列を自動生成する必要がある場合(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; }
}
}
私のVS2008は現在バストされているので、確認できません。C#では、「=」を使用します-どうですか
Dim query = From u In db.Users _
Select 'First Name' = u.FirstName