首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

不能调用委托,该如何解决

2012-03-31 
不能调用委托usingSystemusingSystem.Collections.GenericusingSystem.ComponentModelusingSystem.Data

不能调用委托
using   System;
using   System.Collections.Generic;
using   System.ComponentModel;
using   System.Data;
using   System.Drawing;
using   System.Text;
using   System.Windows.Forms;
using   System.Net.NetworkInformation;
using   System.Media;

namespace   监视网络连接
{
        public   partial   class   Form1   :   Form
        {
                public   Form1()
                {
                        InitializeComponent();
                }
                private   SoundPlayer   MyPlayer   =   new   SoundPlayer();
                private   Microsoft.VisualBasic.Devices.ServerComputer   My   =   new   Microsoft.VisualBasic.Devices.ServerComputer();
                private   void   Form1_Load(object   sender,   EventArgs   e)
                {
                        NetworkChange.NetworkAvailabilityChanged   +=   new   NetworkAvailabilityChangedEventHandler(AvailabilityChangedCallback);
                        MyPlayer.SoundLocation   =   "BEEP2.WAV ";
                        MyPlayer.LoadAsync();
                        MyPlayer.Play();
                }

                static   void   AvailabilityChangedCallback(object   sender,   EventArgs   e)
                {
                        SoundPlayer   MyPlayer   =   new   SoundPlayer();
                        Microsoft.VisualBasic.Devices.ServerComputer   My   =   new   Microsoft.VisualBasic.Devices.ServerComputer();
                        if   (!My.Network.IsAvailable)
                        {
                                MessageBox.Show( "网络连接失败! ",   "信息提示 ",   MessageBoxButtons.OK,   MessageBoxIcon.Information);
                                MyPlayer.SoundLocation   =   "ALARM8.WAV ";
                                MyPlayer.LoadAsync();  
                                MyPlayer.Play();
                        }
                        else


                        {
                                MessageBox.Show( "网络连接成功! ",   "信息提示 ",   MessageBoxButtons.OK,   MessageBoxIcon.Information);
                                MyPlayer.SoundLocation   =   "BASE.WAV ";
                                MyPlayer.LoadAsync();
                                MyPlayer.Play();
                        }
                }
        }
}

上面代码执行后,把掉网线,托盘区显示网络断开,但是该程序没有反映。在AvailabilityChangedCallback函数里面设置断点,没有作用,证明没有执行该函数。想问这是为什么?还有,如果在该窗体上有文本框,当网络状态改变时要在文本框里面显示提示信息,但是现在AvailabilityChangedCallback函数里面又不能直接调用文本框对象,那又要怎样修改?

[解决办法]
把static void AvailabilityChangedCallback(object sender, EventArgs e)
的static去掉就能了而且可以实现改变文本框中的文字代码如下:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Microsoft.VisualBasic.Devices.ServerComputer My = new Microsoft.VisualBasic.Devices.ServerComputer();
delegate void SetTextCallback(string text);
private void Form1_Load(object sender, EventArgs e)
{
NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(AvailabilityChangedCallback);
}
private void SetText(string text)
{
if (textBox1.InvokeRequired)
{
SetTextCallback setTextProc = new SetTextCallback(SetText);
Invoke(setTextProc, new object[] { text });
}
else
{
textBox1.Text = text;
}

}

void AvailabilityChangedCallback(object sender, EventArgs e)
{
if (!My.Network.IsAvailable)
{
SetText(@ "网络连接失败! ");
}
else
{
SetText(@ "网络连接成功! ");
}
}
}
[解决办法]
如果在vs.net 2003中可以直接在AvailabilityChangedCallback中这样写:
textBox1.Text = @ "网络连接失败! ";
但是这样做不是线程安全的

热点排行