Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Чтобы узнать, находитесь ли Вы в "режиме проектирования":
Я нашел, что свойство DesignMode было багги, по крайней мере, в предыдущих версиях Visual Studio. Следовательно, я сделал свое собственное использование следующей логики:
Process.GetCurrentProcess().ProcessName.ToLower().Trim() == "devenv";
Своего рода взлом, я знаю, но он работает хорошо.
Если Вы находитесь в форме или управляете Вами, может использовать свойство DesignMode:
if (DesignMode)
{
DesignMode Only stuff
}
Я не уверен при выполнении в количествах режима отладки как реальные, но простой способ состоит в том, чтобы включать if
оператор в коде, который проверяет на System.Diagnostics.Debugger.IsAttached
.
System.ComponentModel.Component.DesignMode == true
Вы проверяете DesignMode
свойство Вашего управления:
if (!DesignMode)
{
//Do production runtime stuff
}
Примечание, что это не будет работать в Вашем конструкторе, потому что компоненты еще не были инициализированы.
Мы используем следующий код в UserControls, и это делает работу. Только Используя DesignMode не будет работать в Вашем приложении, которое использует Ваши пользовательские пользовательские элементы управления, как указано другими участниками.
public bool IsDesignerHosted
{
get { return IsControlDesignerHosted(this); }
}
public bool IsControlDesignerHosted(System.Windows.Forms.Control ctrl)
{
if (ctrl != null)
{
if (ctrl.Site != null)
{
if (ctrl.Site.DesignMode == true)
return true;
else
{
if (IsControlDesignerHosted(ctrl.Parent))
return true;
else
return false;
}
}
else
{
if (IsControlDesignerHosted(ctrl.Parent))
return true;
else
return false;
}
}
else
return false;
}
Это - выход взлома, но если Вы используете VB.NET и когда Вы выполняете из Visual Studio Мой. Приложение. Развертывание. CurrentDeployment будет Ничем, потому что Вы еще не развернули его. Я не уверен, как проверить эквивалентную стоимость в C#.
Самый надежный подход:
public bool isInDesignMode
{
get
{
System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess();
bool res = process.ProcessName == "devenv";
process.Dispose();
return res;
}
}
Управление. Свойство DesignMode, вероятно, что Вы ищете. Это говорит Вам, если родитель управления открыт в разработчике.
В большинстве случаев это работает отлично, но существуют экземпляры, где это не работает как ожидалось. Во-первых, это не работает в конструкторе средств управления. Во-вторых, DesignMode является ложью для средств управления "внука". Например, DesignMode на средствах управления, размещенных в UserControl, возвратит false, когда UserControl будет размещен в родителе.
существует довольно легкое обходное решение. Это проходит примерно так:
public bool HostedDesignMode
{
get
{
Control parent = Parent;
while (parent!=null)
{
if(parent.DesignMode) return true;
parent = parent.Parent;
}
return DesignMode;
}
}
я не протестировал тот код, но он должен работа.