2011-04-24 4 views
1

Я использую делегат для передачи данных между двумя формами MainForm;Как передать данные между двумя формами?

public delegate void PassData(ListViewItem itemss); 
public PassData passdata; 
private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     passdata(ViewList.FocusedItem); 
} 
call PropertiesForm 
Properties1 pro = new Properties1();    
     pro.Show(); 

В Form2

public void f_pass(ListViewItem item) 
    { 
     this.item = item; 
    } 
    private void Properties1_Load(object sender, EventArgs e) 
    { 
     Main main = new Main(); 
     main.passdata += new Main.PassData(f_pass); 
    } 

Когда я бегу это есть ошибка есть нулевой объект в PassData (ViewList.FocusedItem);

+0

, когда вы звоните в PassData(). вы можете показать мне более подробную информацию –

+0

Я вызываю passdata (ViewList.FocusedItem) в private void ViewList_SelectedIndexChanged из основной формы – giaosudau

+0

Возможный дубликат [Передача переменной между winforms] (http://stackoverflow.com/questions/4247807/passing-variable- между winforms) –

ответ

1

Вы можете создать другой конструктор для формы, в которую вы хотите передать данные. Конструктор будет принимать аргументы типа данных, которые вы хотите, но убедитесь, что вы называете конструктор по умолчанию с помощью

: base() 
+0

, но я хочу использовать делегат – giaosudau

1

кажется, что вы вызов делегата Befor он был создан. Как я понимаю правильно Вы намерены передавать данные от MainForm до PropertiesForm, но инициализация происходит только во время загрузки PropertiesForm. Его очень вероятно, что у вас есть архитектурные проблемы, но сейчас просто попробуйте изменить метод ViewList_SelectedIndexChanged, как показано ниже:

public PassData passdata = null; 
private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(passdata != null) 
    { 
     passdata(ViewList.FocusedItem); 
    } 
} 
+0

Я сделал это, но если использовать if (passdata! = null), он не передает данные между двумя формами? – giaosudau

+0

Да, он не будет передавать данные, пока вы его не инициализируете. Попробуйте установить точку останова на 'if', и вы узнаете, была ли она инициализирована или нет –

0

Я думаю, что данные проходят между формами не является хорошей идеей. Попробуйте использовать некоторых посредников для хранения данных.

0

ли это так,

public partial class Main : Form 
{ 
    public delegate void PassData(ListViewItem itemss); 
    public static event PassData PassDataEvent; 

    private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (PassDataEvent != null) 
     { 
      PassDataEvent(ViewList.FocusedItem); 
     } 
    } 
} 

public partial class Properties1 : Form 
{ 
    public Properties1() 
    { 
     InitializeComponent(); 
     this.Load += new EventHandler(Main_Load); 
    } 

    void Properties1_Load(object sender, EventArgs e) 
    { 
     Main.PassDataEvent += new Main.PassData(Main_PassDataEvent); 
    } 

    void Main_PassDataEvent(ListViewItem itemss) 
    { 
     //do your logic. 
    } 
} 
Смежные вопросы