none
Asp.net2.0DataList控件的ItemCommand事件的困惑? RRS feed

  • 问题

  • 我在一个页面中用到了这个控件,本想在它的单击和双击事件中都能实现选中一行的目标。结果是实现了,但是双击时并不是我想要的。当单击控件时它会选中一行并且下面的后台处理方法只执行一次,但双击时这个方法会执行多次,而且最后一次是执行的CommandName为SingleClick,我很困惑???

    前台页面相关代码如下:           

    <asp:DataList ID="DataList1" runat="server" width="400px"
                    OnItemCommand="DataList1_ItemCommand" OnItemDataBound="DataList1_ItemDataBound">
                        <HeaderTemplate>
                            Tasks
                        </HeaderTemplate>
                        <ItemTemplate>
                            <asp:LinkButton ID="LinkButton1" runat="server" Text="SingleClick" CommandName="SingleClick" Visible="false"/>
                            <asp:LinkButton ID="LinkButton2" runat="server" Text="DoubleClick" CommandName="DoubleClick" Visible="false"/>
                            <asp:Panel ID="Panel1" runat="server">
                                <span style="float:left;">
                                    <b>Id: </b><%# Eval("Id") %>
                                    <b>Task: </b><%# Eval("Task") %>
                                </span>
                                <span style="float:right;">
                                    <b>IsDone: </b><%# Eval("IsDone") %>
                                </span>
                            </asp:Panel>
                        </ItemTemplate>
                        <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />   
                        <ItemStyle BackColor="#F7F7DE" BorderStyle="Solid" BorderColor="lightgray" BorderWidth="1px" />
                        <AlternatingItemStyle BackColor="white" />
                        <SelectedItemStyle BackColor="#CE5D5A" />
                </asp:DataList>

    后台处理代码如下:

     protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
            {
                DataList _dataList = (DataList)source;

                int _selectedIndex = e.Item.ItemIndex;
                string _commandName = e.CommandName;

                switch (_commandName)
                {
                    case("SingleClick"):
                        _dataList.SelectedIndex = _selectedIndex;
                        this.Message.Text += "Single clicked DataList row at index " + _selectedIndex.ToString() + "<br />";
                        break;
                    case("DoubleClick"):
                        this.Message.Text += "Double clicked DataList row at index " + _selectedIndex.ToString() + "<br />";
                        break;
                }
            }


    李东洋



    • 已编辑 向往走得更远 2012年3月6日 11:39
    • 已移动 ThankfulHeart 2012年3月6日 12:16 ASP.NET的问题 (发件人:.NET Framework 一般性问题讨论区)
    2012年3月6日 11:15

答案

  • 是的,代码本身没有任何问题。

    经过多次试验终于找到发问题所在。


    李东洋

    2012年3月8日 6:22
  • 是的,代码本身没有任何问题。

    经过多次试验终于找到发问题所在。


    李东洋

    什么问题?请写出并给出解决方案,标记成答案,让我们都学习学习!谢谢!!!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月8日 6:31
  • 这个问题后来解决了。我的解决思路和方法:就是要区别开是单击还是双击的问题,之前之所以双击没有效

    果是因为双击被当作两次单击来处理了。 所以我要在注册脚本时指定一个合适的时间间隔来

    区别单击和双击,具体我的代码为: LinkButton _singleClickButton = (LinkButton)

    e.Item.Controls[1]; string _jsSingle = ClientScript.GetPostBackClientHyperlink

    (_singleClickButton, ""); _jsSingle = _jsSingle.Insert(11, "setTimeout(\"");

    _jsSingle += "\",100)";//这里的100就是自己指定的大小,如果100不能区分开单击和双击

    ,你就把这个值改大点,我改为300就可以了。


    李东洋

    2012年3月28日 9:49

全部回复

  • 按照代码看来,我不认为你的DoubleClick那个Link有问题,应该单击触发ItemCommand事件的。如果你不要那个双击事件,请删除DoubleClick那个按钮。重新编译程序。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月7日 7:39
  • 是的,代码本身没有任何问题。

    经过多次试验终于找到发问题所在。


    李东洋

    2012年3月8日 6:22
  • 是的,代码本身没有任何问题。

    经过多次试验终于找到发问题所在。


    李东洋

    什么问题?请写出并给出解决方案,标记成答案,让我们都学习学习!谢谢!!!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月8日 6:31
  • 你可以直接查看 asp.net 运行时翻译出来的html,是ondoubleclick 还是 只有onclick,还是那句话,控件只是松耦合的,完全依赖就会走偏路

    微软提供的控件都是基于post 传递 事件sender 和相关的事件参数(eventArgs)来完成的,button submit除外,因为微软封装好的 request.form是可以只获取单一button submit的(排他性),当然这也是遵从w3c协议来的,其他所有的事件,全部是post参数,然后到服务器端,找委托的方法

    所以你要做的就是看微软把自己的控件翻译的本地js事件是什么,看看是不是和自己想要的一致,如果他只有onclick,那势必会出现你这种情况,如果有ondoubleclick,js事件还是可以正确运行


    2012年3月10日 2:25
    版主
  • 是的,代码本身没有任何问题。

    经过多次试验终于找到发问题所在。


    李东洋

    什么问题?请写出并给出解决方案,标记成答案,让我们都学习学习!谢谢!!!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    这个并不是答案,只是我希望你分享答案的帖子提示,请取消此标记,谢谢!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月27日 1:16
  • 这个问题后来解决了。我的解决思路和方法:就是要区别开是单击还是双击的问题,之前之所以双击没有效

    果是因为双击被当作两次单击来处理了。 所以我要在注册脚本时指定一个合适的时间间隔来

    区别单击和双击,具体我的代码为: LinkButton _singleClickButton = (LinkButton)

    e.Item.Controls[1]; string _jsSingle = ClientScript.GetPostBackClientHyperlink

    (_singleClickButton, ""); _jsSingle = _jsSingle.Insert(11, "setTimeout(\"");

    _jsSingle += "\",100)";//这里的100就是自己指定的大小,如果100不能区分开单击和双击

    ,你就把这个值改大点,我改为300就可以了。


    李东洋

    2012年3月28日 9:49