2012-04-28 2 views
0

У меня есть служба WCF и клиент [Winform], которые подключаются с помощью netTCPbinding.
клиент вызвал функцию Search(string txtSearch,string path), и сервер должен отправить обратно результат, но я не хочу, чтобы клиент дождался результатов, мне нужен сервер, чтобы отправить его самостоятельно. поэтому всякий раз, когда сервер отправляет элемент назад, клиент должен добавить его в listView1.
Как получить доступ к списку из другого класса?

вот небольшой код клиентского приложения, Так как же мне нужно получить доступ к спискуView1 от Callback, если это возможно!

public partial class Form1 : Form 
{ 
    FileManagerClient client; 
    public Form1() 
    { 
     InitializeComponent(); 
     InstanceContext ctx = new InstanceContext(new Callback()); 
     client = new FileManagerClient(ctx); 
    } 
} 

class Callback : IFileManagerCallback 
{ 
    public void Folder(_Folder folder) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = folder.Name; 
     item.ToolTipText = folder.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     //Add item to listView1 
    } 

    public void File(_File file) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = file.Name; 
     item.ToolTipText = file.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     //Add item to listView1 
    } 
} 

ответ

1

Реализовать событие

public partial class Form1 : Form 
{ 
    FileManagerClient client; 
    public Form1() 
    { 
     InitializeComponent(); 
     Callback callback = new Callback(); 
     //Subscribe event for notification 
     callback.OnDataReceivedEvent +=new Callback.OnDataReceived(callback_OnDataReceivedEvent); 
     InstanceContext ctx = new InstanceContext(callback); 
     client = new FileManagerClient(ctx); 
    } 

    private void callback_OnDataReceivedEvent(object sender, ListViewItem item) 
    { 
     //Add item here 
    } 
} 

class Callback : IFileManagerCallback 
{ 
    private delegate void OnDataReceived(object sender, ListViewItem item); 

    private OnDataReceived _dataReceivedHandler = null; 
    public event OnDataReceived OnDataReceivedEvent { 
     add { _dataReceivedHandler += value; } 
     remove { _dataReceivedHandler -= value; } 
    } 

    public void Folder(_Folder folder) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = folder.Name; 
     item.ToolTipText = folder.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     RaiseEvents(item); 
     //Add item to listView1 
    } 

    public void File(_File file) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = file.Name; 
     item.ToolTipText = file.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     RaiseEvents(item); 
     //Add item to listView1 
    } 

    private void RaiseEvents(ListViewItem item) 
    { 
     if (_dataReceivedHandler != null) 
     { 
      _dataReceivedHandler(this, item); 
     } 
    } 
} 
+0

я думаю, что это идеальный способ, но так как callback получит другие команды, чем просто добавление .. Мне нужно это по-другому, проверьте мой ответ –

0

, так как есть много других, что я должен был бы получить доступ из Form1.cs тогда я думаю, что это самый лучший способ.

Program.cs:

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run((MainForm = new Form1())); 
    } 
    public static Form1 MainForm; 
} 

и я изменили модификатор ListView1 для общественности, так что я могу получить доступ к Form1 общественные элементы из любого класса:

public void Folder(_Folder folder) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = folder.Name; 
     item.ToolTipText = folder.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     item.Group = Program.MainForm.listView1.Groups[1]; 
     item.ImageIndex = Program.MainForm._iconListManager.AddFolderIcon(folder.Path); 
     Program.MainForm.listView1.Items.Add(item); 
    } 

    public void File(_File file) 
    { 
     ListViewItem item = new ListViewItem(); 
     item.Text = file.Name; 
     item.ToolTipText = file.Path; 
     item.Tag = item.ImageIndex; 
     item.Name = item.Text; 
     item.SubItems.Add(Program.MainForm.CnvrtUnit(file.Size)); 
     item.Group = Program.MainForm.listView1.Groups[0]; 
     item.ImageIndex = Program.MainForm._iconListManager.AddFileIcon(file.Path); 
     Program.MainForm.listView1.Items.Add(item); 
    } 
Смежные вопросы