2008-09-24 3 views
14

UPDATELINQ: benutzerdefinierte Spaltennamen

Ich bin im Grunde um die Abfrage zu einem WinForms Bindung DataGridView. Ich möchte, dass die Spaltenüberschriften angemessen sind und bei Bedarf Leerzeichen enthalten. Zum Beispiel möchte ich, dass eine Spaltenüberschrift First Name anstelle von FirstName lautet.


Wie erstellen Sie Ihre eigenen benutzerdefinierten Spaltennamen in LINQ?

Zum Beispiel:

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

Antwort

8

Ich löste mein eigenes Problem aber alle deine Antworten waren sehr hilfreich und zeigten mir die richtige Richtung.

In meiner LINQ Abfrage, wenn ein Spaltenname mehr als ein Wort hätte, würde ich die Worte mit einem Unterstrich trennen:

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

Dann im Paint Methode der DataGridView, ersetzen ich alle in der unterstreichen Header mit einem Leerzeichen:

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 
2

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

2

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, warum Sie dies tun, vielleicht, wenn wir das ultimative Ziel kennen würden, könnten wir Ihnen helfen, eine passende Lösung zu finden.

23

Wie CQ heißt, Sie einen Raum für die Feldnamen nicht hat, können Sie jedoch neue Spalten zurück.

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

Dann können Sie mit der Variablen 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 Räume wäre nicht dürfen.

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

Würde den FirstName in First und LastName in Last umbenennen.

-1

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 ist. Doch das Schlüsselwort let dafür komplexere Abfragen nützlich ist (in diesem Beispiel ist die Spitze von meinem Kopf und nicht das Schlüsselwort let erfordern 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 }; 
-6

Mein VS2008 jetzt kaputt ist, so dass ich kann nicht überprüfen. In C#, würden Sie „=“ verwenden - Wie wäre es

Dim query = From u In db.Users _ 
      Select 'First Name' = u.FirstName 
+0

wenn Sie _can't check_ dann bitte nicht _answer_ bis Sie können _check_ –

3

Sie können Ihre Ergebnisse haben Unterstrichen in den Spaltennamen und verwenden Sie einen Header in ein Template machen zu ersetzen Unterstrichen mit Leerzeichen. 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> 
14

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

Im Code hinter Sie können an die Benutzer binden und es wird die Überschrift auf Vorname setzen.

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

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 festgelegt, anstatt automatisch der Verwendung Spalten erzeugt. In Ihrem Beispiel sieht es so aus, als ob die Abfrage statisch ist und die Titel zur Entwurfszeit bekannt sind. Dies ist wahrscheinlich die beste Wahl.

jedoch [, obwohl Ihre Frage spezifizieren diese Anforderung nicht] - wenn der Kopftext (und Formatierung etc.) ist nicht zur Design-Zeit bekannt, aber zur Laufzeit bestimmt werden, und wenn Sie benötigen, um Auto-Spalten zu erzeugen (mit AutoGenerateColumns = true ") gibt es Problemumgehungen dafür.

Eine Möglichkeit, das zu tun, ist eine neue Steuerelementklasse erstellen, die die Gridview erbt. Sie können Header, Formatierung usw. für die automatisch generierten Felder durch Überschreiben festlegen "CreateAutoGeneratedColumn" der Gridview 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; } 
    } 
} 
4

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 den Code für diese Funktion für jetzt nicht, aber es ist ziemlich einfach zu schreiben.

+0

Besseres Beispiel für mehrere Spalten –

5

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

Für diejenigen unter Ihnen, 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('_', ' '); 
    } 

} 
2

Mit Linq Erweiterungsmethode:

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