为什么Windows Form TextBox不能从外部类更新?

时间:2014-08-18 02:08:46

标签: c# visual-studio-2008

新手在这里。我正在运行Visual Studio C#Express 2008.我有两个Windows窗体,每个都有一个TextBox。文本框在同一个类中更新,但不是作为来自类外部的调用方法的结果。我需要能够在调用UpdateListOfRooms()方法时更新tbRooms.Text。我在下面的伪代码中概述了这个问题。感谢您的帮助!

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"
}

2014年8月20日更新: 我是一个忙碌的蜜蜂:)我阅读了@jmcilhinney教程的所有部分,并决定通过在MainMenu类中引用两个表单Locations和Rooms来引用它:

(MainMenu.cs)创建了位置和房间的实例。在构造函数中,'rooms'被传递给'locations'实例,并显示两个表单。

(Locations.cs)另一个Rooms实例是在类范围创建的,因此可以被类的所有方法看到。在构造函数中,此实例设置为MainMenu传递的实例,这意味着此类正在使用在MainMenu中创建的相同实例。当用户更改dgvLocations上的选择时,将触发'dgvLocations_SelectionChanged'事件,该事件将调用Rooms.UpdateRooms方法。

(Rooms.cs)'UpdateRooms'方法根据传递的'locationID'值显示一组新的房间。

此链接很有帮助。 Visual C# - Access instance of object created in one class in another

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
        }
}

1 个答案:

答案 0 :(得分:0)

在第一个代码段中,您创建了一个新的fRooms对象,但您从未调用其ShowShowDialog方法,这意味着您永远不会将其显示给用户。这意味着您不会看到对该表单所做的任何更改。据推测,用户可以看到fRooms对象,但您没有对该对象进行任何更改。

考虑一下。让我们说我给你一个记事本,你打开它看看第一页。让我们说我现在买了一个新的记事本并写在它的第一页上。你是否希望看到我写在你面前的页面上神奇地写的字?当然不是。我们都拿着一个记事本,但它们是两个不同的记事本。你在看另一个,我在另一个上写,所以你赢了;看看我写的是什么。

表格也是如此。它们都是fRooms个对象,但它们是两个不同的fRooms个对象。您对其中的更改不会影响另一个。如果您希望用户看到您所做的更改,则必须对用户正在查看的fRooms对象进行更改。