【急】回调函数里调用其他函数的问题

FireBirdCN 2013-08-27 10:11:44
小弟初次玩C#,有个其他的例子看了下,console程序,我打算把功能做到自己堆的界面上。
自己写了一个函数modifyUI(string epc)是修改界面上的 TextBox ListView的,
在回调函数中调用该函数modifyUI(epcstr)
可为什么UI界面上没有反应呢?
直接在一个button按钮下调用这个函数modifyUI,点击按钮时是能响应并修改UI界面的。
恳请赐教,我哪里出了问题。谢谢~
...全文
248 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
FireBirdCN 2013-09-10
  • 打赏
  • 举报
回复
引用 11 楼 u011303459 的回复:

<span style="color: #FF0000;">modifyTextBox(packetEpcString);</span>
上面这句编译能过?
这个是 我想把那句加成红色的 HTML的代码 在C#代码段里失效了,就直接显示出代码来了 我真正的代码里 没有这个的
FireBirdCN 2013-09-10
  • 打赏
  • 举报
回复
引用 12 楼 shiyuyao1987 的回复:
回调函数不在当前ui线程里吧
后来放线程里调了 就好了~ 谢谢
FireBirdCN 2013-09-10
  • 打赏
  • 举报
回复
引用 10 楼 jshi123 的回复:
这样呢? listView1.Invoke(new Action(()=>listView1.Items.Add(lvi)));
也还是不行 我自己从别的例子学了下 ,对C#的托管 理解还需要加强啊。。 谢谢了
jshi123 2013-08-27
  • 打赏
  • 举报
回复
试试modifyTextBox最后一行改成: this.Invoke(new Action(()=>listView1.Items.Add(lvi)));
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
把MessageBox那行打开,是有正常的显示信息弹出来的
hr_3773 2013-08-27
  • 打赏
  • 举报
回复
设置断点看看有没有执行!
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
33行那里 是我调用自己写的函数 想加成红色的显示的 这字体代码在C#格式里 没起作用
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
回调函数
public Int32 MyCallback
           (
           [In]      Int32 handle,
           [In]      UInt32 bufferLength,
           [In]      IntPtr pBuffer,
           [In, Out] IntPtr context
           )
        {
            Byte[] packetBuffer = new Byte[bufferLength];
            Byte packetFlags;
            Int16 packetType;
            Int16 packetLength;

            Marshal.Copy(pBuffer, packetBuffer, 0, (Int32)bufferLength);

            packetFlags = packetBuffer[1];
            packetType = (Int16)((packetBuffer[3] << 8) | packetBuffer[2]);
            packetLength = (Int16)((packetBuffer[5] << 8) | packetBuffer[4]);
            string packetTypeString;
            packetTypeString = "Mac Packet rcv'd, PacketType = ";
            packetTypeString += string.Format("0x{0:X4}", packetType);

                Int16 length = (Int16)(((packetLength - 3) * 4) - (packetFlags >> 6));
                string packetEpcString;
                packetEpcString = "    EPC = ";
                for (int index = 0; index < length; ++index)
                {
                    packetEpcString += string.Format("{0:X2}", packetBuffer[20 + index]);

                }

                Console.WriteLine(packetEpcString);
                modifyTextBox(packetEpcString);
                //MessageBox.Show(packetEpcString);


            ++callbackCount;

            if (40 == callbackCount)
            {
                return 1;
            }

            return 0;
        }
我自己写的函数
        void modifyTextBox(string epc)
        {
            ListViewItem lvi;
            ListViewItem.ListViewSubItem lvsi;
            lvi = new ListViewItem();
            lvi.Text = epc;
            lvi.ImageIndex = 0;
            lvi.Tag = "fullname";
            lvsi = new ListViewItem.ListViewSubItem();
            lvsi.Text = "lvsi";
            lvi.SubItems.Add(lvsi);
            this.listView1.Items.Add(lvi);
            
        }
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
@lxcnn @caozhy @bdmh 大神们都在忙?
sunriseWang 2013-08-27
  • 打赏
  • 举报
回复
贴源码上来看看. 你这说的不清不楚的
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
顶上去。。大神们赐教~~
shiyuyao1987 2013-08-27
  • 打赏
  • 举报
回复
回调函数不在当前ui线程里吧
feiniao19830822 2013-08-27
  • 打赏
  • 举报
回复

<span style="color: #FF0000;">modifyTextBox(packetEpcString);</span>
上面这句编译能过?
jshi123 2013-08-27
  • 打赏
  • 举报
回复
这样呢? listView1.Invoke(new Action(()=>listView1.Items.Add(lvi)));
FireBirdCN 2013-08-27
  • 打赏
  • 举报
回复
引用 8 楼 jshi123 的回复:
试试modifyTextBox最后一行改成: this.Invoke(new Action(()=>listView1.Items.Add(lvi)));
Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧