Почему Windows Form TextBox не будет обновляться извне класса?

1

Новичок здесь. Я запускаю Visual Studio С# Express 2008. У меня есть две формы Windows, каждая из которых имеет TextBox. Обновление текстовых полей в одном классе, но не как результат вызванного метода вне класса. Мне нужно иметь возможность обновлять tbRooms.Text при вызове метода UpdateListOfRooms(). Я описал проблему в псевдокоде ниже. Я ценю вашу помощь!

fLocations.cs

fLocations_Load()
{
    this.tbLocations.Text = Properties.Settings.Default.LocationID + " locationsLoad";  --updates
}

dgvLocations_SelectionChanged()
{
    var rooms = new fRooms();
    rooms.tbRooms.Text = Properties.Settings.Default.LocationID + " locationssSelectionChanged";  --updates
    rooms.UpdateListOfRooms(); 

}

fRooms.cs

fRooms_Load()
{
    this.tbRooms.Text = Properties.Settings.Default.LocationID + " roomsLoad"; --updates

}

UpdateListOfRooms()
{
    this.tbRooms.Text = Properties.Settings.Default.LocationID + " roomsUpdateListOfRooms";  --does NOT update; still says "roomsLoad"
}

Обновлено 8/20/14: я был занятой пчелой :) Я прочитал все части учебника от @jmcilhinney и решил приблизиться к этому, включив ссылки на две формы, места и комнаты в классе MainMenu, который запускается их:

(MainMenu.cs) Созданы экземпляры мест и номеров. В конструкторе "комнаты" передаются в экземпляр "местоположения" и отображаются обе формы.

(Locations.cs) Экземпляр других комнат создается в области класса, поэтому его можно увидеть всеми методами класса. В конструкторе этот экземпляр установлен в тот, который передается MainMenu, что означает, что этот класс работает с тем же экземпляром, созданным в MainMenu. Когда пользователь меняет выбор на dgvLocations, запускается событие 'dgvLocations_SelectionChanged', которое вызывает метод Rooms.UpdateRooms.

(Rooms.cs) Метод UpdateRooms отображает новый набор комнат на основе переданного значения 'locationID'.

Эта ссылка была полезна. Visual С# - экземпляр экземпляра объекта, созданного в одном классе в другом.

public partial class MainMenu : Form
{   
    Locations locations;
    Rooms rooms;    

    public MainMenu()
    {       
        rooms = new Rooms();        
        locations = new Locations(rooms);       
        locations.Show();
        rooms.Show();
        InitializeComponent();
    }
}

public partial class Locations : Form
{   
    Rooms rooms;

    public Locations(Rooms r)
    {
        rooms = r;
        InitializeComponent();
    }

    private void Locations_Load(object sender, EventArgs e)
    {
        // Populate this.dgvLocations using SQL query.
    }

    private void dgvLocations_SelectionChanged(object sender, EventArgs e)
    {

        // Update the rooms instance with current locationID.
        rooms.UpdateRooms(dgvLocations.CurrentCell.Value.ToString());
    }

}

public partial class Rooms : Form
{
        public Rooms()
        {   
            InitializeComponent();
        }

        private void Rooms_Load(object sender, EventArgs e)
        {   
            // Populate this.dgvRooms using SQL query.
        }

        public void UpdateRooms(string locationID)
        {
            // Update dgvRooms based on user changing the locationID in dgvLocations
        }
}
  • 0
    Я вообще не большой поклонник венгерской нотации, но, если вам нужно использовать ее для переменных, это одно. Использование его для имен типов - это совсем другое, и просто неправильно. Никакие классы не должны называться fLocations и fRooms . Они должны быть именами, такими как LocationsForm или RoomsWindow или тому подобное. Затем, когда вы объявляете переменную этого типа, вы можете использовать венгерскую нотацию и назвать переменную fLocations или frmRoms . Смысл венгерской нотации - указать тип переменной. Вам не нужно указывать тип типа.
  • 0
    Получил это обозначение, я внесу изменения. Благодарю.
Теги:
visual-studio-2008

1 ответ

0

В первом фрагменте кода вы создаете новый объект fRooms но никогда не называете его методом Show или ShowDialog, что означает, что вы никогда не показываете его пользователю. Это означает, что любые изменения, внесенные вами в эту форму, не будут видны. Предположительно, пользователь может видеть объект fRooms, но вы не fRooms никаких изменений в это.

Учти это. Скажем, что я даю вам блокнот, и вы открываете его и смотрите на первую страницу. Скажем, теперь я покупаю новый блокнот и пишу на первой странице. Ожидаете ли вы, что слова, которые я написал, волшебным образом появятся на странице перед вами? Конечно нет. Мы оба держим блокнот, но они - две разные блокноты. Вы смотрите на одного, и я пишу на другом, так что вы выиграли, я вижу, что я пишу.

То же самое касается ваших форм. Они оба fRooms объектами fRooms но они представляют собой два разных объекта fRooms. Изменения, внесенные вами в один, не повлияют на другие. Если вы хотите, чтобы пользователь увидел внесенные вами изменения, вы должны внести эти изменения в объект fRooms который ищет пользователь.

  • 0
    Чтобы узнать больше о передаче данных между формами, я предлагаю вам прочитать мой блог из трех частей, начиная здесь: jmcilhinney.blogspot.com.au/2012/04/…
  • 0
    Спасибо тебе большое за это! Я прочитаю все ваши сообщения в блоге, отредактирую свое сообщение соответствующим образом и отвечу в ответ. --Тим

Ещё вопросы

Сообщество Overcoder
Наверх
Меню