FineUI 官方论坛

标题: DropDownList多选的时候清空有问题 [打印本页]

作者: 竹席    时间: 2020-6-24 19:06
标题: DropDownList多选的时候清空有问题
多选的状态下GetClearSelectionReference这个没有清空f_state里的SelectedValueArray
导致回发的时候又带上了选中的那项

作者: sanshi    时间: 2020-6-26 23:00
已测试,这个地方没问题。

首先 ClearSelection 是注册一段JS脚本,JS脚本是不会改变 f_state 的任何内容,因为这个是服务器用的变量,只能在服务器端改变。但是 ClearSelection 的确会在客户端清空选中项,并在回发时影响到服务器端的SelectedItemArray属性。

测试案例:1. 打开:https://pro.fineui.com/dropdownlist/multiselect.aspx
2. 任意选中两项
3. 在浏览器端执行脚本:F.ui.SimpleForm1_DropDownList1.clearSelection()
4. 点击【获取此下拉列表的选中项】,此时服务器返回【无选中项
5. Done!

[attach]12498[/attach]


作者: 竹席    时间: 2020-7-9 12:01
sanshi 发表于 2020-6-26 23:00
已测试,这个地方没问题。

首先 ClearSelection 是注册一段JS脚本,JS脚本是不会改变 f_state 的任何内容 ...

看下这个,流程说明放在包里了

https://wwa.lanzous.com/idgojeg3hdi
密码:2x89



作者: sanshi    时间: 2020-7-10 09:53
竹席 发表于 2020-7-9 12:01
看下这个,流程说明放在包里了

https://wwa.lanzous.com/idgojeg3hdi

我测试了你的示例,顺便把代码放出来:
  1. <f:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server"></f:PageManager>
  2.         <f:Panel runat="server" ID="Panel1" IsFluid="true" IsViewPort="true" AutoScroll="true" ShowBorder="false" ShowHeader="false" >
  3.             <Items>
  4.                 <f:DropDownList runat="server" ID="ddl_Test" Label="测试" LabelAlign="Left" LabelWidth="70" AutoPostBack="true" AutoSelectFirstItem="false" EmptyText="请选择" EnableMultiSelect="true">
  5.                     <f:ListItem Text="1" Value="1" />
  6.                     <f:ListItem Text="2" Value="2" />
  7.                     <f:ListItem Text="3" Value="3" />
  8.                 </f:DropDownList>
  9.                 <f:Button runat="server" ID="btnClear" Text="清除" Width="140" Height="32"></f:Button>
  10.                 <f:Button runat="server" ID="btnSub" Text="获取" Width="140" Height="32"></f:Button>
  11.                 <f:TextBox runat="server" ID="tb_1"></f:TextBox>
  12.             </Items>
  13.         </f:Panel>
复制代码


后台:
  1. protected void Page_Init(object sender, EventArgs e)
  2.         {
  3.             ddl_Test.SelectedIndexChanged += Ddl_Test_SelectedIndexChanged;
  4.             btnClear.Click += BtnClear_Click;
  5.             btnSub.Click += BtnSub_Click;
  6.         }

  7.         private void BtnClear_Click(object sender, EventArgs e)
  8.         {
  9.             ddl_Test.ClearSelection();
  10.         }

  11.         private void Ddl_Test_SelectedIndexChanged(object sender, EventArgs e)
  12.         {

  13.         }

  14.         private void BtnSub_Click(object sender, EventArgs e)
  15.         {
  16.             tb_1.Text = string.Join(",", ddl_Test.SelectedValueArray);
  17.         }

  18.         
复制代码



然后你的流程说明:
流程是这样的
先全部选中,点一次获取,在点一次清除(这里是在后台清除的选中)
执行下F(Panel1_ddl_Test).f_state,SelectedValueArray不应该清除吗?为什么还是在




==我是分割线===============================================
其实,我前面回答的已经很清楚了,你可以仔细品一品我这句话:
首先 ClearSelection 是注册一段JS脚本,JS脚本是不会改变 f_state 的任何内容,因为这个是服务器用的变量,只能在服务器端改变。但是 ClearSelection 的确会在客户端清空选中项,并在回发时影响到服务器端的SelectedItemArray属性。


关键点看红色标识:

首先 ClearSelection 是注册一段JS脚本,JS脚本是不会改变 f_state 的任何内容,因为这个是服务器用的变量,只能在服务器端改变。但是 ClearSelection 的确会在客户端清空选中项,并在回发时影响到服务器端的SelectedItemArray属性。

=========
你要理解一点,f_state是用来维护前后台数据的,所以不要在客户端视图使用f_state里面的任何变量。


你上面说的逻辑是不对的:
先全部选中,点一次获取,在点一次清除(这里是在后台清除的选中)
执行下F(Panel1_ddl_Test).f_state,SelectedValueArray不应该清除吗?
此时执行:F(Panel1_ddl_Test).f_state 里面的内容不会有任何变化,也就是SelectedValueArray肯定还在!

只有在下次回发时,才会更新服务器端变量:SelectedValueArray

整个流程没有问题。







欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4