求教高手:实在不知道要把问题描述成如何?
有一个DataGridView控件
控件的列字段是静态创建的
总共有8列程序运行的时候顺序是这样的,下面给出三个函数,很明显我要实现的是异步通信的方式
第一次运行程序的时候没有问题,
当我关掉重新运行该程序的时候,
也就是第二次我依然使用先前的套接字就会提示“不能向没有列的DataGridView控件添加行。”
重要的是我用红色字体标出的问题。。 public void StartListen()
{
if (MainForm.sockBindFlag.Equals(false))//套接字还未创建
{
.....
}
while (true)
{
allDone.Reset();
listenSoc.Soc.BeginAccept(new AsyncCallback(AcceptCallback), listenSoc);//接收请求
allDone.WaitOne();
}
} public void AcceptCallback(IAsyncResult ar)
{
try
{
.......
.......
/*dataGridView1添加内容*/
string updateDataGridView = "SELECT RoomNo as 房间编号,RoomName as 房间名称,SocketNo as 套接字编号,";
updateDataGridView += "FloorName as 层名称,BulidName as 楼名称, AreaName as 区域名称,BrightNess as 房间亮度 from RoomCtrlView ";
updateDataGridView += "where IPAddress ='" + clientSoc[nSoc].RemoteUserName + "'";
DataSet ds = G_SqlExecute.GetDs(updateDataGridView, "Room");
UpdateRoomDataView(ds);
clientSoc[nSoc].ReceiveData();//接收消息
}
}
catch (SocketException se)
{
MessageBox.Show(se.Message + "AcceptCallback");
}
} private void UpdateRoomDataView(DataSet ds)
{
int columnCount = 0;
columnCount = ds.Tables[0].Columns.Count;
object[] obj = new object[columnCount + 1]; if (ds.Tables[0].Rows.Count > 0)
{
for (int k = 0; k < ds.Tables[0].Rows.Count; k++)
{
obj[0] = 0;
for (int i = 1; i < columnCount; i++)
{
obj[i] = ds.Tables[0].Rows[k][i - 1].ToString();
}
obj[columnCount] = ds.Tables[0].Rows[k][columnCount - 1];
}
try
{
dataGridView1.Rows.Add(obj);//将每一行的值添加到DataGridView上
//在这我捕捉异常,提示“不能向没有列的DataGridView控件添加行。”
//可是我的列明明就是静态创建好的,这是为什么???? }
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
有一个DataGridView控件
控件的列字段是静态创建的
总共有8列程序运行的时候顺序是这样的,下面给出三个函数,很明显我要实现的是异步通信的方式
第一次运行程序的时候没有问题,
当我关掉重新运行该程序的时候,
也就是第二次我依然使用先前的套接字就会提示“不能向没有列的DataGridView控件添加行。”
重要的是我用红色字体标出的问题。。 public void StartListen()
{
if (MainForm.sockBindFlag.Equals(false))//套接字还未创建
{
.....
}
while (true)
{
allDone.Reset();
listenSoc.Soc.BeginAccept(new AsyncCallback(AcceptCallback), listenSoc);//接收请求
allDone.WaitOne();
}
} public void AcceptCallback(IAsyncResult ar)
{
try
{
.......
.......
/*dataGridView1添加内容*/
string updateDataGridView = "SELECT RoomNo as 房间编号,RoomName as 房间名称,SocketNo as 套接字编号,";
updateDataGridView += "FloorName as 层名称,BulidName as 楼名称, AreaName as 区域名称,BrightNess as 房间亮度 from RoomCtrlView ";
updateDataGridView += "where IPAddress ='" + clientSoc[nSoc].RemoteUserName + "'";
DataSet ds = G_SqlExecute.GetDs(updateDataGridView, "Room");
UpdateRoomDataView(ds);
clientSoc[nSoc].ReceiveData();//接收消息
}
}
catch (SocketException se)
{
MessageBox.Show(se.Message + "AcceptCallback");
}
} private void UpdateRoomDataView(DataSet ds)
{
int columnCount = 0;
columnCount = ds.Tables[0].Columns.Count;
object[] obj = new object[columnCount + 1]; if (ds.Tables[0].Rows.Count > 0)
{
for (int k = 0; k < ds.Tables[0].Rows.Count; k++)
{
obj[0] = 0;
for (int i = 1; i < columnCount; i++)
{
obj[i] = ds.Tables[0].Rows[k][i - 1].ToString();
}
obj[columnCount] = ds.Tables[0].Rows[k][columnCount - 1];
}
try
{
dataGridView1.Rows.Add(obj);//将每一行的值添加到DataGridView上
//在这我捕捉异常,提示“不能向没有列的DataGridView控件添加行。”
//可是我的列明明就是静态创建好的,这是为什么???? }
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
也有可能是关于异步通信的问题!!!不知道怎么会这样?
高手再帮我想想哈!
之前一次的套接字并没有soc.ShutDown然后soc.Close()
我第二次开启程序的时候,是直接使用原来绑定好的套接字。
代码如下: private void McuControl_FormClosed(object sender, FormClosedEventArgs e)
{
if (serverThread != null)
{
if (serverThread.IsAlive)
{
if (listenSoc.Soc.Connected)//从这里开始一直都没有执行到里面
{
listenSoc.Soc.Shutdown(SocketShutdown.Both);//所以套接字关闭不了使得我不得不继续使用这个套接字,而没办法重新创建一个新的套接字!
listenSoc.Soc.Close();
}
serverThread.Abort();
}
}
}
DataGridView这个控件其实是有那些列的!!!
之前我用动态创建列的时候,每次窗体创建都会去执行DataGridView控件列的动态创建。
现在换成静态创建列竟然还是提示那个错误...我要崩溃了~~
这一点很诡异....
明明有,却提示“不能向没有列的DataGridView控件添加行。”
/// 监听指定网络接口Ip的指定端口
/// </summary>
/// <param name="ipAddress">Ip地址</param>
/// <param name="port">端口号</param>
public void Begin(string ipAddress, int port)
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint end = new IPEndPoint(IPAddress.Parse(ipAddress), port);
socket.Bind(end); //最大监听队列长度为100
socket.Listen(100);
//异步监听开始
socket.BeginAccept(new AsyncCallback(Accept), socket);
} #endregion #region 异步接收 /// <summary>
/// 异步接收数据
/// </summary>
/// <param name="ia"></param>
void Accept(IAsyncResult ia)
{
Socket soc = ia.AsyncState as Socket; Socket worker = soc.EndAccept(ia); soc.BeginAccept(new AsyncCallback(Accept), soc); byte[] buf = new byte[1];
SocketHelper helper = new SocketHelper(buf, worker); //异步读取数据
worker.BeginReceive(buf, 0, 1, SocketFlags.None, new AsyncCallback(Receive), helper);
}是这个吗?这就是你说的简洁的异步通信??
“不能向没有添加列的DataGridView”控件添加行,必须添加列!”
我的DataGridView控件是静态的,而且列也是静态添加好的。 private void UpdateRoomDataView(DataSet ds)
{
int columnCount = 0;
columnCount = ds.Tables[0].Columns.Count;
object[] obj = new object[columnCount + 1]; if (ds.Tables[0].Rows.Count > 0)
{
for (int k = 0; k < ds.Tables[0].Rows.Count; k++)
{
obj[0] = 0;
for (int i = 1; i < columnCount; i++)
{
obj[i] = ds.Tables[0].Rows[k][i - 1].ToString();
}
obj[columnCount] = ds.Tables[0].Rows[k][columnCount - 1];
}
try
{
dataGridView1.Rows.Add(obj);//将每一行的值添加到DataGridView上
//在这我捕捉异常,提示“不能向没有列的DataGridView控件添加行。”
//可是我的列明明就是静态创建好的,这是为什么???? }
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}上面这段代码到底是什么问题啊?