Как передать значения в statusStrip из элемента управления формы?

Это контекст моих элементов управления:

/*
Form
    StatusStrip
        ToolStripStatusLabel

    TableLayoutPanel
        MyGenioView
*/

Так,MyGenioView перехватываетMouseMove обработчик события. Код, который уже существует для прямоугольника с резинкой. Так что я:

public void MyMouseMove(Object sender, MouseEventArgs e)
{
    Point ptCurrent = new Point(e.X, e.Y);
    // If we "have the mouse", then we draw our lines.
    if (m_bHaveMouse)
    {
        // If we have drawn previously, draw again in
        // that spot to remove the lines.
        if (m_ptLast.X != -1)
        {
            MyDrawReversibleRectangle(m_ptOriginal, m_ptLast);
        }
        // Update last point.
        m_ptLast = ptCurrent;
        // Draw new lines.
        MyDrawReversibleRectangle(m_ptOriginal, ptCurrent);
    }

    // New code here
}

Я не могу понять, что я хочу установить значениеstatusStrip1.statusLabel отMyGenioView MouseMove обработчик. Я не могу понять, как это сделать.

Код, который я хочу использовать:

OdGePoint3d pt = GetWorldCoordinates(ptCurrent);
String strCoordinate = String.Format("{0},{1}", ptCurrent.X, ptCurrent.Y);

Но как правильно кормить его основными формами?statusStrip объект?

Спасибо за вашу помощь.

Обновить:

I знать как установить текст объекта метки statusStrip. Это не моя проблема. Моя проблема связана с контекстом моего события обработчика мыши и его отношением к форме. Пожалуйста, посмотрите контекст элементов управления, как описано в начале вопроса. Комментарии до сих пор не приняли это во внимание.

Это текущее место вформа что я создаюMyGenioView объект (который получает обработчик мыши):

private void viewToolStripMenuItem_Click(object sender, EventArgs e)
{
    OdDbDatabase TDDatabase = m_oGenioView.GetDatabase();

    if (m_oGenioViewCtrl != null)
        m_oGenioViewCtrl.DeleteContext();

    tableLayoutPanel.RowCount = 1;
    tableLayoutPanel.ColumnCount = 1;
    m_oGenioViewCtrl = new MyGenioView();
    m_oGenioViewCtrl.TDDatabase = TDDatabase;
    m_oGenioViewCtrl.ResetDevice(true);
    m_oGenioViewCtrl.Dock = DockStyle.Fill;
    m_oGenioViewCtrl.Margin = new Padding(1);
    tableLayoutPanel.Controls.Add(m_oGenioViewCtrl);
}
 Reza Aghaei27 мая 2016 г., 14:23
К сожалению, я не мог понять значение этого контекста! У вас есть доступ к экземпляру вашей формы? Где вы добавили обработчик событий?
 Reza Aghaei27 мая 2016 г., 14:18
Если вы в той же форме, просто используйтеthis.toolStripStatusLabel1.Text = "Some text";
 Andrew Truckle27 мая 2016 г., 14:25
@RezaAghaei Я не вижу, как еще объяснить. На форме есть таблица LayoutPanel. Это назначено объекту MyGenioView. Я поставил немного больше кода в вопросе. Это помогает?
 Andrew Truckle27 мая 2016 г., 14:45
@HansPassant Я не знаю, что не так с формулировкой моего вопроса.
 Hans Passant27 мая 2016 г., 14:45
Ну, тогда сделай это доступным. Помимо изменения его свойства Modifiers на Public, самый простой способ - добавить публичное свойство к вашему классу формы. Пожалуйста, исправьте свой вопрос и используйте правильные имена классов формы.
 Reza Aghaei27 мая 2016 г., 14:16
Добавьте ярлык к нему во время разработки и установитеText этикетки
 Andrew Truckle27 мая 2016 г., 14:19
@HansPassant Я знаю это. Все дело в том, что переменная toolStripStatusLabel недоступна из MyGenioView.
 Andrew Truckle27 мая 2016 г., 14:20
@RezaAghaei Неужели вы не видите «контекст», который я отображал в самом начале вопроса? Благодарю.
 Hans Passant27 мая 2016 г., 14:17
Когда вы используете конструктор для добавления метки статуса в StatusStrip, вы получаете для нее имя идентификатора. И это просто toolStripStatusLabel1.Text = strCoordinate; Довольно неясно, что пошло не так с этим.
 Andrew Truckle27 мая 2016 г., 14:17
@RezaAghaei, у меня уже есть «statusLabel». Я не знаю, как получить к нему доступ из данного контекста.
 Reza Aghaei27 мая 2016 г., 14:33
У вас есть несколько вариантов, чтобы сделать это.1- ВведитеAction<Point> в пользовательском контроле.uc.UpdateStatus = p=>this.toolStripStatusLabel1.Text = p.ToString(); 2- Создать событиеUpdateStatus в пользовательском элементе управления и поднять его вMouseMove и потреблять событие в форме. Также вы можете использоватьMouseMove само событие.3- Используйте иерархию элементов управления для доступа к форме, например, в пользовательском элементе управления,this.ParentForm это форма, то вы можете использоватьControls Коллекция формы для поиска статусной полосы.

Ответы на вопрос(1)

Решение Вопроса

ВведитеAction<Point> в пользовательском контролеСоздатьStatusUpdate событие в пользовательском элементе управленияВы также можете получить доступ к элементу управления, используя иерархию элементов управления, например, в пользовательском элементе управления.this.ParentForm ваша родительская форма, и вы можете найти целевой элемент управления, используяControls сбор или обнародование в форме.

Первые два варианта намного лучше, потому что таким образом можно отделить ваш элемент управления от формы и ваш пользовательский элемент управления во многих формах и других контейнерах. Предоставление способа обновления статуса зависит от контейнера.

Лучший вариант - создать и использовать событие.

1- ВведитеAction<Point> в пользовательском контроле

ВведитеAction<Point> в пользовательском элементе управления и использовать его вMouseMove, Для этого поместите это в пользовательский контроль:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Action<Point> StatusUpdate{ get; set; }

//Don't forget to assign the method to MouseMove event in your user control 
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
    if (StatusUpdate!= null)
        StatusUpdate(e.Location);
}

И поместите этот код в форму:

private void Form1_Load(object sender, EventArgs e)
{
    this.userControl11.StatusUpdate= p => this.toolStripStatusLabel1.Text=p.ToString();
}

2- СоздатьStatusUpdate событие в пользовательском элементе управления

СоздатьStatusUpdate событие в пользовательском элементе управления и поднять его вMouseMove и потреблять событие в форме. Также вы можете использоватьMouseMove само событие.

Для этого поместите этот код в пользовательский контроль:

public event EventHandler<MouseEventArgs> StatusUpdate;
public void OnStatusUpdate(MouseEventArgs e)
{
    var handler = StatusUpdate;
    if (handler != null)
        handler(this, e);
}

//Don't forget to assign the method to MouseMove event in your user control 
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
    OnStatusUpdate(e);
}

И затем положить в форму, положить этот код:

//Don't forget to assign the method to StatusUpdate event in form  
void userControl11_StatusUpdate(object sender, MouseEventArgs e)
{
    this.toolStripStatusLabel1.Text = e.Location.ToString();
}
 Andrew Truckle27 мая 2016 г., 15:14
Большой! Я должен был сделать небольшое изменение в использованииAction<Point>, я использовалOdGePoint3d вместо. И бит в форме, который я должен был сделать в другом обработчике, где создается пользовательский элемент управления (по причинам, он нулевой в методе загрузки формы). Я могу изменить это вовремя. Спасибо!
 Reza Aghaei27 мая 2016 г., 15:16
Добро пожаловать :) Рад слышать, что у вас есть основная идея. Когда вы поймете основную идею и узнаете шаблон, вы можете применить его и просто улучшить.

Ваш ответ на вопрос