【问题标题】:Pass data from User Control A to User Control B within a Form [duplicate]在表单中将数据从用户控件 A 传递到用户控件 B [重复]
【发布时间】:2020-02-05 17:42:37
【问题描述】:

对于那里的大师,我在表单中传递值 2 个用户控件时遇到问题。我有具有组合框和按钮的用户控件 A,以及具有数据网格视图的控件 B。现在我想在 datagridview 中的用户控件 B 中显示数据。如何将数据从 UCA 传递到 UCB? 这是我要传递的数据:

所以在用户控件 A 中,当我单击名为 Generate 的按钮时,它将使用下面的 GetConvo() 中生成的数据填充用户控件 B 中的 datagridview。

public DataTable GetConvo() {
    DataTable table = new DataTable();
    table.Columns.Add("ConvoUser", typeof(Object));
    table.Columns.Add("Message", typeof(Object));
    table.Columns.Add("Date", typeof(Object));

    var _data = from data in User.GetMatchConvo(comboBox3.SelectedValue.ToString())
                select new {
                    convoUser = data.actor_id,
                    convoMessage = data.message,
                    convoDate = data.creation_timestamp
                };
    foreach (var data in _data) {
        table.Rows.Add(data.convoUser, data.convoMessage, data.convoDate);
    }

    //dataGridView1.AllowUserToAddRows = false;
    //dataGridView1.AllowUserToDeleteRows = false;
    return table;
}

private UserInterface User = new UserData();

【问题讨论】:

  • 通常这是使用 UserControlB 订阅的 UserControlA 上的事件来完成的 - 例如 hereherehere
  • 与处理任何其他控件的方式相同:引发事件(使用自定义 EventArgs 派生类)或使用 DataBindings。或两者。您还可以使用 intermediate 类来处理特定对象之间的特定关系。
  • 我看到很多建议使用事件来做到这一点,但我还没有尝试使用事件,我不知道如何正确地做到这一点。新手在这里..
  • userControlB.Data = userControlA.DataUserControlB 中的Data 是一个公共属性,它获取或设置DataGridView.DataSourceUserControlA 中的Data 是一个公共属性,它获取点击后生成的数据。
  • 要从外部访问 UserControl 的控件,您需要将它们设为公共,或者您需要定义公共属性以访问它们或定义公共属性以公开它们的特定属性。

标签: c# .net winforms user-controls


【解决方案1】:

UserControlA 知道/应该知道 UserControlB?

然后在UserControlA 中创建一个UserControlB 类型的属性,然后每当您要将数据传递给UserControlB 时,请使用您在UserControlB 属性中的实例。

哪个是哪个?对,也许BindingNavigatorBindingSource 的例子更清楚一点:

public class BindingNavigator
{
    Public BindingSource BindingSource { get; set; }
    public int Position
    {
        get {return BindingSource?.Position ?? -1};
        set {if(BindingSource!=null) BindingSource.Position = value;}
    }
}

然后,当您将BindingNavigator 的实例和BindingSource 的实例拖放到表单上时,将BindingNavigatorBindingSource 属性设置为bindingSource1

UserControlA 不/不应该知道 UserControlB?

使用事件。这是最自然的方式。您每天都在使用它,例如TextChangedSelectedIndexChanged 等等。是时候为您的用户控件创建一个了。

实际上你需要在UserControlA 中引发事件,然后在表单上,​​当你删除UserControlA 的一个实例和UserComtrolB 的一个实例时,处理UserControlA 事件并设置UserControlB 属性。

为了更清楚一点,再次使用BindingNavigatorBindingSource

public class BindingNavigator
{
    public event EventHanlder MovingNext;
    public void MoveToNextRecord()
    {
        MovingNext?.Invoke(this, EventArgs.Empty);
    }
}

然后,当您将BindingNavigator 的实例和BindingSource 的实例放在表单上时,处理bindingNavigator1MovingNext 事件并设置bindingSource1 的位置:

bindingNavigator1.MovingNext += (obj, args) => {
    bindingSource1.Position +=1;
};

想了解更多关于活动的信息?查看以下文档:

【讨论】:

  • 示例中的事件处理程序是一个 lambda 事件处理程序。如果您更喜欢设计师,只需在设计师的帮助下处理bindingNavigator1MovingNext 事件。
  • @james 有什么可以帮助您应用解决方案的吗?
【解决方案2】:

您可以在用户控件中创建一个静态变量并将数据传递给该变量

在UserControl A或B中创建一个变量

public static string info = string.empty;

在打开用户控件之前,您必须将数据传递给变量

UsercontrolA.info = "hello";
new UsercontrolA();

更新

在 UsercontrolA 中创建用户控件的静态实例

public static internal UsercontrolA uc;

现在在你的演员中

public UsercontrolA(){
InitializeComponent();
uc = this;
}

你现在需要一个函数来执行显示操作

public void showData(){
// your display codes
messagebox.show(info);
}

最后,在你点击按钮后,也会调用显示函数。

UsercontrolA.info = "hello";
new UsercontrolA();
UsercontrolA.us.showData();

我没有测试代码,但它肯定可以工作

【讨论】:

  • 我想做的是在用户控件A中单击按钮后立即在datagridview中显示数据。我不确定这是否可行。
  • 我强烈建议不要使用此解决方案,您根本不需要静态成员。阅读另一篇文章。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多