ЛИНК:имена пользовательских столбцов
-
02-07-2019 - |
Вопрос
ОБНОВЛЯТЬ
Я в основном привязываю запрос к 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