Другое событие 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));
}
Я решил свою собственную проблему, но все Ваши ответы были очень полезны и указали на меня в правильном направлении.
В моем 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
Можно использовать ключевое слово, которому 'позволяют':
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 };
Как 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 для Длительности.
Мой VS2008 арестован прямо сейчас, таким образом, я не могу проверить. В C# Вы использовали бы "=" - Как насчет
Dim query = From u In db.Users _
Select 'First Name' = u.FirstName
Как другие уже указали, если заголовок заголовка и т.д. известен во время проектирования, выключите 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; }
}
}
То, что Вы на самом деле сделали бы, устанавливает ссылку на переменную на возврат, нет способа назвать переменную с пространством. Есть ли причина конечного результата, что Вы делаете это, возможно, если бы мы знали конечную цель, то мы могли бы помочь Вам предложить решение, которое соответствует.
Можно заставить результаты иметь символы нижнего подчеркивания в имени столбца и использовать 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>
Я использовал бы:
var query = from u in db.Users
select new
{
FirstName = u.FirstName,
LastName = u.LastName,
FullName = u.FirstName + " " + u.LastName
};
(от Scott Nichols)
наряду с функцией, которая читает Camel-регистр, представляют в виде строки, и вставляет пробелы перед каждым новым капиталом (Вы могли добавить правила для идентификатора и т.д.). У меня нет кода для той функции со мной на данный момент, но его довольно простого для записи.
Можно также добавить обработчик событий для замены тех символов нижнего подчеркивания для Вас!
Для тех из Вас, кто любит 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('_', ' ');
}
}
Я не вижу, почему необходимо было бы сделать это, при попытке сделать это для сетки или чего-то, почему не только называют заголовок в HTML?
Если Вы хотите изменить текст заголовка, можно установить это в определении 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();
}