Frage

UPDATE

Ich bin Bindung im Grunde die Abfrage an einen WinForms DataGridView. Ich mag die Spaltenüberschriften für angemessen und Räume hat, wenn nötig. Zum Beispiel würde ich eine Spaltenkopf will statt First Name wird FirstName.


Wie Sie Ihre eigenen benutzerdefinierten Spaltennamen in LINQ erstellen?

Zum Beispiel:

Dim query = From u In db.Users _
            Select u.FirstName AS 'First Name'
War es hilfreich?

Lösung 3

löste ich mein eigenes Problem, aber alle Ihre Antworten waren sehr hilfreich und wies mich in der richtigen Richtung.

In meiner LINQ Abfrage, wenn ein Spaltenname hat mehr als ein Wort würde ich die Worte mit einem Unterstrich getrennt:

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

Dann innerhalb der Paint Methode des DataGridView, ersetzte ich alle Unterstrichen im Header mit einem Raum:

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

Andere Tipps

Wie CQ Staaten, können Sie keinen Raum für die Feldnamen haben, können Sie jedoch neue Spalten zurückgeben können.

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

Dann können Sie auf die Variable Abfrage binden von oben oder Schleife durch sie, was auch immer ....

foreach (var u in query)
{
   // Full name will be available now 
   Debug.Print(u.FullName); 
}

Wenn Sie die Spalten umbenennen möchten, können Sie, aber keine Leerzeichen erlaubt würde.

var query = from u in db.Users
            select new
            {
                First = u.FirstName,
                Last = u.LastName
            };

Möchten Sie den First auf Vor- und Nachnamen umbenennen auf Last.

Wenn Sie den Kopftext ändern möchten, können Sie das in der Gridview Definition gesetzt ...

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="First Name" />
    </Columns>
</asp:GridView>

Im Code hinter sich an die Benutzer binden kann, und es wird den Header Vorname gesetzt.

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

Sie können auch einen Ereignishandler hinzufügen, um diese Unterstreichungen für Sie zu ersetzen!

Für diejenigen, die C # lieben:

datagrid1.ItemDataBound += 
    new DataGridItemEventHandler(datagrid1_HeaderItemDataBound);

Und Ihre Handler sollte wie folgt aussehen:

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

}

Ich würde verwenden:

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

(von Scott Nichols)

zusammen mit einer Funktion, die ein Kamel Fall Zeichenfolge liest und fügt Leerzeichen vor jedem neuen Kapital (Sie Regeln für ID usw. hinzufügen könnte). Ich habe nicht den Code für diese Funktion bei mir jetzt, aber seine ziemlich einfach zu schreiben.

Sie können Ihre Ergebnisse haben Unterstrichen in den Spaltennamen und verwenden Sie einen Header in ein Template machen Unterstrichen mit Leerzeichen zu ersetzen. Oder Unterklasse der Datacontrolfield für die Gridview und überschreiben die Eigenschaft 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>

Ich sehe nicht, warum Sie müßten das tun, wenn Sie versuchen, dass für ein Gitter oder etwas zu tun, warum nicht nur die Header-Namen im HTML-Format?

Was würden Sie tatsächlich tun, ist eine Variable Bezug auf die Rückkehr Einstellung, gibt es keine Möglichkeit, eine Variable mit einem Raum zu nennen. Gibt es ein Endergebnis Grund, warum Sie dies tun, vielleicht, wenn wir das ultimative Ziel wussten wir, Sie kommen mit einer Lösung helfen könnte, das passt.

Mit Linq Erweiterungsmethode:

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

Wie andere haben bereits darauf hingewiesen, wenn der Header-Titel usw. zur Entwurfszeit bekannt ist, schalten AutoGeneratedColumns ab und nur den Titel usw. in der Felddefinition gesetzt statt Auto mit Spalten erzeugt. Von Ihrem Beispiel scheint es, dass die Abfrage statisch ist und dass die Titel zur Design-Zeit bekannt, so dass wahrscheinlich die beste Wahl ist.

Jedoch [, obwohl Ihre Frage diese Anforderung nicht angeben] - , wenn der Kopftext (und Formatierung etc.) ist nicht zur Design-Zeit bekannt, aber wird bei festgelegt werden Laufzeit und wenn Sie auto brauchen, um Spalten zu erzeugen (mit Autogeneratecolumns = true ") gibt es Workarounds dafür.

Eine Möglichkeit, das zu tun, ist eine neue Steuerklasse zu erstellen, die die Gridview erbt. Anschließend können Sie Header gesetzt, Formatierungen etc. für die automatisch generierten Felder von der „CreateAutoGeneratedColumn“ der gridview überschreiben. Beispiel:

//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; }
    }
}

Ich glaube, diese explizite Nameart erreicht, lassen sich mit

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

Sie können das 'lassen' Stichwort:

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

Wie andere Antworten hier gezeigt haben, ist dies nicht sinnvoll. Doch das Schlüsselwort let dafür komplexere Abfragen nützlich ist (in diesem Beispiel aus der Spitze von meinem Kopf und erfordert nicht das Schlüsselwort let zu arbeiten):

from x in dc.Users 
let match = regex.Match(".*ass.*", x.Name) 
let comment = match ? "*snicker*" : "sup"
select new { Name = x.Name, Comment = comment };

ist mein VS2008 jetzt kaputt, so kann ich nicht überprüfen. In C #, würden Sie "=" verwenden - wie etwa

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top