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

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

17
задан Ali 20 July 2017 в 08:25
поделиться

11 ответов

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

В моем 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
13
ответ дан 30 November 2019 в 10:10
поделиться

Можно использовать ключевое слово, которому 'позволяют':

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 };
-1
ответ дан 22 October 2019 в 00:12
поделиться

Как 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 к Первому и LastName для Длительности.

26
ответ дан 30 November 2019 в 10:10
поделиться

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

Dim query = From u In db.Users _
            Select 'First Name' = u.FirstName
-6
ответ дан 30 November 2019 в 10:10
поделиться

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

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

Один способ сделать, который должен создать новый класс управления, который наследовал 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; }
    }
}
1
ответ дан 30 November 2019 в 10:10
поделиться

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

2
ответ дан 30 November 2019 в 10:10
поделиться

Можно заставить результаты иметь символы нижнего подчеркивания в имени столбца и использовать 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>
3
ответ дан 30 November 2019 в 10:10
поделиться

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

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

(от Scott Nichols)

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

4
ответ дан 30 November 2019 в 10:10
поделиться

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

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

}
6
ответ дан 30 November 2019 в 10:10
поделиться

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

2
ответ дан 30 November 2019 в 10:10
поделиться

Если Вы хотите изменить текст заголовка, можно установить это в определении 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();
}
14
ответ дан 30 November 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: