LINQ: пользовательские имена столбцов - PullRequest
17 голосов
/ 24 сентября 2008

UPDATE

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


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

Например:

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

Ответы [ 13 ]

26 голосов
/ 24 сентября 2008

Как утверждает 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.

14 голосов
/ 24 сентября 2008

Если вы хотите изменить текст заголовка, вы можете установить его в определении 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();
}
12 голосов
/ 14 января 2009

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

В моем 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
6 голосов
/ 28 января 2009

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

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

}
4 голосов
/ 08 января 2009

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

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

(от Скотта Николса)

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

3 голосов
/ 24 сентября 2008

Вы можете сделать ваши результаты подчеркиваниями в имени столбца и использовать 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>
2 голосов
/ 19 ноября 2014

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

SomeDataSource.Select(i => new { NewColumnName = i.OldColumnName, NewColumnTwoName = i.OldColumnTwoName});
2 голосов
/ 24 сентября 2008

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

2 голосов
/ 24 сентября 2008

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

1 голос
/ 25 сентября 2008

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

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

Один из способов сделать это - создать новый класс управления, который наследует вид сетки. Затем вы можете установить заголовок, форматирование и т. Д. Для автоматически сгенерированных полей, переопределив сетку представления «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; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...