0

netTCPbindingを使用して接続するWCFサービスlibとclient[Winform]があります。
クライアントが関数Search(string txtSearch,string path)を呼び出し、サーバーが結果を返送する必要がありますが、クライアントに結果を待たせたくないので、サーバーが独立して結果を返送する必要があります。したがって、サーバーがアイテムを送り返すときはいつでも、クライアントはそれをlistView1に追加する必要があります。

これがクライアントアプリケーションの小さなコードです。可能であれば、クラスからlistView1にアクセスするにはどうすればよいでしょうか。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
   }
}
4

2 に答える 2

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);
        }
    }
}
于 2012-04-28T08:24:26.327 に答える
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修飾子をPublicに変更したので、どのクラスからでも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);
    }
于 2012-04-28T19:35:01.150 に答える