2008-09-24 3 views
14

UPDATELINQ: пользовательские имена столбцов

Я в основном связывании запроса к WinForms DataGridView. Я хочу, чтобы заголовки столбцов были подходящими и имели места, когда это необходимо. Например, я хотел бы, чтобы заголовок столбца был First Name вместо FirstName.


Как вы создаете собственные имена столбцов в LINQ?

Например:

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

ответ

8

Я решил свою проблему, но все ваши ответы были очень полезными и указали мне в правильном направлении.

В моем 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 
2

Я не понимаю, почему вы должны сделать это, если вы пытаетесь сделать это для сетки или что-то, почему бы просто не назвать заголовок в HTML?

2

Что бы вы на самом деле делали, это установить ссылку на переменную return, не существует способа назвать переменную пробелом. Есть ли причина, по которой вы это делаете, возможно, если бы мы знали конечную цель, мы могли бы помочь вам придумать подходящее решение.

23

В качестве состояний 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.

-1

Вы можете использовать «» пусть ключевое слово:

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

Как и другие ответы здесь показали, что это не полезно. Тем не менее, пусть ключевое слово полезно для выполнения более сложных запросов (этот пример с верхней частью моей головы и не требует Выпускаемого ключевого слова, чтобы работать):

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

Мой VS2008 является лопнул прямо сейчас, так что я не могу проверить. В C#, вы бы использовать «=» - Как насчет

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

если вы _can't check_, а затем, пожалуйста, не _answer_, пока не сможете _check_ – 2017-07-20 06:08:38

3

Вы можете сделать ваши результаты имеют подчеркивания в имени столбца и использовать HeaderTemplate в TemplateField заменить символы подчеркивания пробелами. Или подкласс DataControlField для GridView и переопределить свойство 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

Если вы хотите изменить текст заголовка, вы можете установить, что в 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(); 
} 
1

Как и другие уже указывал, если название заголовка и т.д., как известен во время разработки, выключите AutoGeneratedColumns и просто установить заголовок и т.д. в определении поля, вместо использования автогенерируемых столбцов. Из вашего примера видно, что запрос является статическим и что заголовки известны во время разработки, поэтому, вероятно, ваш лучший выбор.

Однако [хотя ваш вопрос не указать это требование] - если текст заголовка (и форматирование и т.д.) является не известно во время разработки, но будет определяться во время выполнения, и если вам нужно автоматически генерировать столбцы (используя AutoGenerateColumns = true "), есть обходные пути для этого.

Один из способов сделать это - создать новый класс управления, который наследует gridview. Затем вы можете установить заголовок, форматирование и т. д. для автоматически генерируемых полей, переопределяя «CreateAutoGeneratedColumn» gridview. Пример:

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

Я хотел бы использовать:

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

(от Scott Nichols)

наряду с функцией, которая считывает строку Camel Case и вставляет пробелы перед каждой новой столицы (можно добавить правила для ID и т.д.). На данный момент у меня нет кода для этой функции, но его довольно просто написать.

+0

Лучший пример для нескольких столбцов – 2014-06-26 09:32:50

5

Вы также можете добавить обработчик событий, чтобы заменить эти символы подчеркивания для вас!

Для тех из вас, кто любит 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('_', ' '); 
    } 

} 
2

Использование Linq метод расширения:

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