Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.
В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:
rb = GetComponent<Rigidbody>();
. Эта строка кода работает лучше всего под ваши функции Start()
или Awake()
. rb = AddComponent<RigidBody>();
Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))]
над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!
ContextMenu
: Проблема заключается в том, что параметр sender
указывает на пункт в контекстном меню, которое было нажато, а не на контекстное меню.
Это простое исправление, потому что каждый MenuItem
предоставляет метод GetContextMenu
, который расскажет вам, какой ContextMenu
содержит этот пункт меню.
Измените свой код на следующее:
private void MenuViewDetails_Click(object sender, EventArgs e)
{
// Try to cast the sender to a MenuItem
MenuItem menuItem = sender as MenuItem;
if (menuItem != null)
{
// Retrieve the ContextMenu that contains this MenuItem
ContextMenu menu = menuItem.GetContextMenu();
// Get the control that is displaying this context menu
Control sourceControl = menu.SourceControl;
}
}
ContextMenuStrip
: Это немного изменит ситуацию, если вы используете ContextMenuStrip
вместо ContextMenu
, Два элемента управления не связаны друг с другом, и экземпляр одного не может быть передан экземпляру другого.
Как и прежде, элемент , который был нажат, все еще возвращен в параметре sender
, поэтому вам нужно будет определить ContextMenuStrip
, которому принадлежит этот отдельный пункт меню. Вы делаете это с помощью свойства Owner
. Наконец, вы будете использовать свойство SourceControl
, чтобы определить, какой элемент управления отображает контекстное меню.
Измените свой код следующим образом:
private void MenuViewDetails_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripItem menuItem = sender as ToolStripItem;
if (menuItem != null)
{
// Retrieve the ContextMenuStrip that owns this ToolStripItem
ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip;
if (owner != null)
{
// Get the control that is displaying this context menu
Control sourceControl = owner.SourceControl;
}
}
}
Старая запись, но в случае, если кто-то вроде меня наткнулся на нее:
Для ContextMenuStrip выше не работало для меня, но это привело к обнаружению того, что произошло.
void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ContextMenuStrip menu = sender as ContextMenuStrip;
Control sourceControl = menu.SourceControl;
MessageBox.Show(sourceControl.Name);
}
Это дало мне имя ожидаемого контроля. Вы можете ввести подтверждение и т. Д. С операторами if, я просто отправляю сообщения, чтобы добраться до точки.