Передать данные из пользовательского элемента управления A в пользовательский элемент управления B в форме - PullRequest
3 голосов
/ 05 февраля 2020

Для мастеров, у меня проблемы с передачей значений 2 пользовательских элементов управления в форме. У меня есть usercontrol A, который имеет выпадающий список, а также кнопку и элемент управления B, который имеет представление данных. Теперь я хочу отобразить данные в пользовательском элементе управления B, который находится в сетке данных. Как я могу передать данные из UCA в UCB? Вот данные, которые я хочу передать:

Таким образом, в пользовательском элементе управления A, когда я нажал кнопку с именем Generate, он заполнит сетку данных в пользовательском элементе управления B данными, сгенерированными в GetConvo () ниже.

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();

enter image description here

Ответы [ 2 ]

4 голосов
/ 05 февраля 2020

UserControlA знает / должен знать UserControlB?

Затем создайте свойство типа UserControlB в UserControlA, затем, когда вы захотите передать данные в UserControlB, используйте экземпляр, который у вас есть в UserControlB свойство.

Что есть что? Да, может быть, пример BindingNavigator и BindingSource немного понятнее:

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 в форме, установите BindingSource свойство BindingNavigator до bindingSource1.

UserControlA не знает / не должен знать UserControlB?

Использовать события. Это самый естественный способ. Каждый день вы используете его, как TextChanged, SelectedIndexChanged и так далее. Время создать его для вашего пользовательского элемента управления.

Фактически вам нужно вызвать событие в UserControlA, а затем в форме, когда вы отбрасываете экземпляр UserControlA и экземпляр UserComtrolB, дескриптор Событие UserControlA и свойство UserControlB.

Чтобы сделать его более понятным, снова с BindingNavigator и BindingSource:

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

Затем, когда вы отбросили экземпляр BindingNavigator и экземпляр BindingSource в форме, обрабатывают MovingNext событие bindingNavigator1 и устанавливают позицию bindingSource1:

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

Хотите узнать больше о событиях? Взгляните на следующие документы:

0 голосов
/ 05 февраля 2020

вы можете создать переменную stati c в usercontrol и передать данные в эту переменную

в UserControl A или B. Создать переменную

public static string info = string.empty;

, и прежде чем открывать usercontrol, вы должны передать данные в переменную

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

ОБНОВЛЕНИЕ

создать в пользовательском контроле stati c экземпляр usercontrolA

public static internal UsercontrolA uc;

теперь в вашем ctor

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

Теперь вам нужна функция для выполнения операции отображения

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

И в конце, после нажатия кнопки, также вызовите функцию отображения.

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

Я не сделал проверить коды, но это определенно должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...