Вопрос

ОБНОВЛЯТЬ

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


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

Например:

Dim query = From u In db.Users _
            Select u.FirstName AS 'First Name'
Это было полезно?

Решение 3

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

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

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

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

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

АСПХ:

<%@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 и просто установите заголовок и т. д. в определении поля вместо использования автоматически создаваемых столбцов.Из вашего примера видно, что запрос является статическим и что заголовки известны во время разработки, поэтому это, вероятно, ваш лучший выбор.

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

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

Я считаю, что этого можно достичь, используя явный тип имени.

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

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

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

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

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

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

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top