Другое событие 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));
}
Это должно быть полезно: http://weblogs.asp.net/jgalloway/archive/2007/10/03/asp-net-setting-the-defaultbutton-for-a-login-control.aspx
можно использовать следующее для ссылки на кнопку в шаблоне Управления входом в систему:
DefaultButton="Login$LoginButton"
В основном, можно определить DefaultButton не только на уровне Формы, но также и на отдельном уровне Панели, пока фокус в панели, кнопка по умолчанию для панели будет использоваться, если Вы совершите нападки, "Входят"
Большой ответ Ведущее устройство Смешения ! По существу просто используйте Панель. DefaultButton, но я хочу разрешить беспорядок о том, на что точно необходимо установить его. Это не просто ".ID" или ".UniqueID" - документации немного недостает на этом.
необходимо установить его на UniqueID кнопки, относительно именованный контейнер Панели UniqueID. Например, если Ваша панель UniqueID является "Body$Content$pnlLogin", и Ваша кнопка входа в систему UniqueID является "Body$Content$ucLogin$btnLogin" (потому что это в управлении, названном "ucLogin"), затем, необходимо установить Панель. DefaultButton к "ucLogin$btnLogin".
можно разработать это в коде следующим образом. (Я не мог найти метод библиотеки классов для этого, но сообщить мне, находите ли Вы тот.)
void SetDefaultButton(Panel panel, IButtonControl button)
{
string uniqueId = ((Control)button).UniqueID;
string panelIdPrefix = panel.NamingContainer.UniqueID + Page.IdSeparator;
if (uniqueId.StartsWith(panelIdPrefix))
{
uniqueId = uniqueId.Substring(panelIdPrefix.Length);
}
panel.DefaultButton = uniqueId;
}
необходимо добавить что-то вроде этого в загрузке страницы...
txtPassword.Attributes.Add("onKeyPress", "javascript:if (event.keyCode == 13) __doPostBack('" + lnkSubmit.UniqueID + "','')")
текстовое поле пароля имеет атрибут onKeyPress, добавил, что это вызовет doPostBack на кнопке отправки, если "Ввести" клавиша будет нажата. Это моделирует нажатие на кнопку отправки.
Кажется, что кнопка входа в систему выкладывается как <input type="button">
, а не <input type="submit">
. Вы могли всегда обрабатывать LoginControl по шаблону и добавлять кнопку отправки, избавление от отвратительной разметки по умолчанию одновременно!
, Если необходимо использовать JavaScript для фиксации этого, что-то серьезно неправильно! (но тогда это кажется на знание этого)
Основываясь на ваших хороших ответах, создал настраиваемый элемент управления, который
позволяет странице иметь несколько кнопок по умолчанию в зависимости от того, какая панель находится в фокусе.
Он переопределяет метод Panel OnLoad и свойство DefaultButton.
public class DefaultButtonPanel:Panel
{
protected override void OnLoad(EventArgs e)
{
if(!string.IsNullOrEmpty(DefaultButton))
{
LinkButton btn = FindControl(DefaultButton) as LinkButton;
if(btn != null)
{
Button defaultButton = new Button {ID = DefaultButton.Replace(Page.IdSeparator.ToString(), "_") + "_Default", Text = " "};
defaultButton.Style.Add("display", "none");
PostBackOptions p = new PostBackOptions(btn, "", null, false, true, true, true, true, btn.ValidationGroup);
defaultButton.OnClientClick = Page.ClientScript.GetPostBackEventReference(p) + "; return false;";
Controls.Add(defaultButton);
DefaultButton = defaultButton.ID;
}
}
base.OnLoad(e);
}
/// <summary>
/// Set the default button in a Panel.
/// The UniqueID of the button, must be relative to the Panel's naming container UniqueID.
///
/// For example:
/// Panel UniqueID is "Body$Content$pnlLogin"
/// Button's UniqueID is "Body$Content$ucLogin$btnLogin"
/// (because it's inside a control called "ucLogin")
/// Set Panel.DefaultButton to "ucLogin$btnLogin".
/// </summary>
/// <param name="panel"></param>
/// <param name="button"></param>
public override string DefaultButton
{
get
{
return base.DefaultButton;
}
set
{
string uniqueId = value;
string panelIdPrefix = this.NamingContainer.UniqueID + Page.IdSeparator;
if (uniqueId.StartsWith(panelIdPrefix))
{
uniqueId = uniqueId.Substring(panelIdPrefix.Length);
}
base.DefaultButton = uniqueId;
}
}
}
Эй, я нашел это решение в сети, у меня оно сработало.
<asp:Panel ID="panelLogin" runat="server" DefaultButton="Login1$LoginButton">
<asp:Login ID="Login1" runat="server" >
<LayoutTemplate>
...
<asp:Button ID="LoginButton" .../>
</LayoutTemplate>
</asp:Login>
</asp:Panel>
Предполагая, что Login1 - это ID вашего элемента управления входом.
Чтобы 'enter' отправлялся в любом месте страницы, добавьте init в codebehind:
protected void Page_Init(object sender, EventArgs e)
{
this.Form.DefaultButton = Login1.FindControl("LoginButton").UniqueID;
}
Чтобы 'enter' отправлялся только внутри элемента управления входом, оберните элемент управления в asp:Panel и установите
DefaultButton="Login1$LoginButton"
на панели
Оба подхода отлично работают с мастер-страницами.