【问题标题】:Why Windows Form TextBox won't update from outside class?为什么 Windows 窗体文本框不会从课外更新?
【发布时间】:2014-08-18 02:08:45
【问题描述】:

这里是新手。我正在运行 Visual Studio C# Express 2008。我有两个 Windows 窗体,每个窗体都有一个文本框。文本框在同一个类中更新,但不是从类外部调用方法的结果。调用 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 中创建的 same 实例。当用户更改 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
        }
}

【问题讨论】:

  • 我根本不是匈牙利符号的忠实粉丝,但是,如果您必须将它用于变量,那是一回事。将它用于类型名称完全是另一回事,而且完全是错误的。不应将任何类命名为 fLocationsfRooms。它们应该是 LocationsFormRoomsWindow 之类的名称。然后,当您声明该类型的变量时,您可以使用匈牙利表示法并将变量命名为fLocationsfrmRoms。匈牙利符号的要点是指示变量的类型。不需要指明类型的类型。
  • 得到它的符号,我会做出改变。谢谢。

标签: c# visual-studio-2008


【解决方案1】:

在第一个代码 sn-p 中,您创建了一个新的 fRooms 对象,但您从不调用它的 ShowShowDialog 方法,这意味着您从不向用户显示它。这意味着您对该表单所做的任何更改都不会被看到。大概用户可以看到一个fRooms 对象,但您没有对该对象进行任何更改。

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

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

【讨论】:

  • 要了解有关在表单之间传递数据的更多信息,我建议您阅读我的 3 部分博客文章,从这里开始:jmcilhinney.blogspot.com.au/2012/04/…
  • 非常感谢您!我会阅读你所有的博客文章,相应地编辑我的文章,然后回复。 --蒂姆
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 2022-01-07
  • 2018-03-01
  • 2011-01-29
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多