Новичок здесь. Я запускаю 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
}
}
В первом фрагменте кода вы создаете новый объект fRooms
но никогда не называете его методом Show
или ShowDialog
, что означает, что вы никогда не показываете его пользователю. Это означает, что любые изменения, внесенные вами в эту форму, не будут видны. Предположительно, пользователь может видеть объект fRooms
, но вы не fRooms
никаких изменений в это.
Учти это. Скажем, что я даю вам блокнот, и вы открываете его и смотрите на первую страницу. Скажем, теперь я покупаю новый блокнот и пишу на первой странице. Ожидаете ли вы, что слова, которые я написал, волшебным образом появятся на странице перед вами? Конечно нет. Мы оба держим блокнот, но они - две разные блокноты. Вы смотрите на одного, и я пишу на другом, так что вы выиграли, я вижу, что я пишу.
То же самое касается ваших форм. Они оба fRooms
объектами fRooms
но они представляют собой два разных объекта fRooms
. Изменения, внесенные вами в один, не повлияют на другие. Если вы хотите, чтобы пользователь увидел внесенные вами изменения, вы должны внести эти изменения в объект fRooms
который ищет пользователь.
fLocations
иfRooms
. Они должны быть именами, такими какLocationsForm
илиRoomsWindow
или тому подобное. Затем, когда вы объявляете переменную этого типа, вы можете использовать венгерскую нотацию и назвать переменнуюfLocations
илиfrmRoms
. Смысл венгерской нотации - указать тип переменной. Вам не нужно указывать тип типа.