То же контекстное меню для нескольких сетевых данных [дубликат]

Буквально самый простой способ исправить NullReferenceExeption имеет два пути. Если у вас есть GameObject, например, с прикрепленным скриптом и переменной с именем rb (rigidbody), эта переменная начнет пустую, когда вы начнете игру. Вот почему вы получаете NullReferenceExeption, потому что на компьютере нет данных, хранящихся в этой переменной.

В качестве примера я буду использовать переменную RigidBody. Мы можем добавить данные действительно легко на самом деле несколькими способами:

  1. Добавить RigidBody к вашему объекту с помощью AddComponent> Физика> Rigidbody Затем зайдите в свой скрипт и введите rb = GetComponent<Rigidbody>();. Эта строка кода работает лучше всего под ваши функции Start() или Awake().
  2. Вы можете добавить компонент программно и назначить переменную одновременно с одной строкой кода: rb = AddComponent<RigidBody>();

Дальнейшие заметки: если вы хотите, чтобы единство добавлялось компонент для вашего объекта, и вы, возможно, забыли добавить его, вы можете ввести [RequireComponent(typeof(RigidBody))] над объявлением класса (пробел ниже всех ваших приложений). Наслаждайтесь и получайте удовольствие от игр!

69
задан Taryn 3 February 2011 в 14:16
поделиться

2 ответа

Для параметра 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;
        }
     }
 }
101
ответ дан Cody Gray 23 August 2018 в 21:58
поделиться

Старая запись, но в случае, если кто-то вроде меня наткнулся на нее:

Для ContextMenuStrip выше не работало для меня, но это привело к обнаружению того, что произошло.

void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    ContextMenuStrip menu = sender as ContextMenuStrip;
    Control sourceControl = menu.SourceControl;
    MessageBox.Show(sourceControl.Name);
}

Это дало мне имя ожидаемого контроля. Вы можете ввести подтверждение и т. Д. С операторами if, я просто отправляю сообщения, чтобы добраться до точки.

3
ответ дан Mark 23 August 2018 в 21:58
поделиться
Другие вопросы по тегам:

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