[〜#〜]更新[〜#〜]
基本的には、クエリをWinForms DataGridView
にバインドしています。列ヘッダーを適切にし、必要に応じてスペースを入れたい。たとえば、列ヘッダーをFirstName
ではなくFirst Name
にします。
LINQで独自のカスタム列名をどのように作成しますか?
例えば:
Dim query = From u In db.Users _
Select u.FirstName AS 'First Name'
私は自分の問題を解決しましたが、あなたの答えはすべて非常に役に立ち、正しい方向に私を向けました。
私の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の名前をLastに変更します。
ヘッダーテキストを変更したい場合は、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
};
(スコットニコルズから)
キャメルケースの文字列を読み取り、新しい大文字の前にスペースを挿入する関数とともに(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のヘッダーに名前を付けてみませんか?
実際に行うことは、変数参照を戻り値に設定することです。スペースを使用して変数に名前を付ける方法はありません。あなたがこれをしている最終結果の理由はありますか、おそらく私たちが最終的な目標を知っていれば、あなたが適切な解決策を考え出すのを助けることができます。
Linq拡張メソッドの使用:
SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
他の人がすでに指摘しているように、ヘッダーのタイトルなどが設計時にわかっている場合は、自動生成された列を使用する代わりに、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; }
}
}
これは明示的な名前タイプを使用して実現できると思います
system.Name,
sysentity.Name
//change this to
entity = sysentity.Name