【问题标题】:DropDownList OnSelectedIndexChanged - Cancel the selected valueDropDownList OnSelectedIndexChanged - 取消选中的值
【发布时间】:2013-04-19 10:18:13
【问题描述】:

我有一个面板,其中包含一个 ListView 和一个 itemTemplate,其中每个元素包含一个下拉列表、两个文本框和一个删除按钮。

每个 Listview 元素的每个下拉列表都包含相同的数据,即来自数据源的值列表,但所选值在不同行中不同。某些值可以相同,这取决于约束。

对于我的下拉列表中的某些元素,这个约束是我可以在两行上具有相同的值。

我在设计中将我的下拉列表与 OnSelectedIndexChanged 事件和 autoPostback 绑定为 True:

<asp:DropDownList ID="ddlLinkToDestinationParent" CssClass="ddl-link-to ddl-link-to-child" runat="server"  AutoPostBack="True" OnSelectedIndexChanged="ddlNewConsumptionLinkToDestinationParent_OnSelectedIndexChanged" data-headcount='<%# Eval("HeadCount") %>' />

我传入我的事件(服务器端)。

var ddl = sender as DropDownList;

        if (IsDestinationSelected(ddl))
        {
            // Display error message
            // cancel the selection of my dropdownlist or select another value...

        }

IsDestinationSelected 方法允许知道是否找到了具有此值和约束的下拉列表。如果为真,我想取消我在下拉列表中选择的项目

错误信息后我可以写什么?

我尝试了一些解决方案,但没有什么有趣的...(320 只是为了测试,但它是一个列表项):

ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue("320"));

这是我的清单项目:

<select name="ctl00$Main$lvSetConsumptionsSite$ctrl1$ddlLinkToDestinationParent" onchange="javascript:setTimeout('__doPostBack(\'ctl00$Main$lvSetConsumptionsSite$ctrl1$ddlLinkToDestinationParent\',\'\')', 0)" id="ctl00_Main_lvSetConsumptionsSite_ctrl1_ddlLinkToDestinationParent" class="ddl-link-to ddl-link-to-child" data-headcount="0">
    <option value="">--- Type de consom° ---</option>
    <option value="870">petit dejeuner 1 siege</option>
    <option value="877">petit dejeuner 2 (siege)</option>
    <option value="133">dejeuner 1 siege</option>
    <option value="26">dejeuner 2 (siege)</option>
    <option value="237">dejeuner 3 (siege)</option>
    <option value="238">dejeuner 4 (siege)</option>
    <option value="239">dejeuner 5 (siege)</option>
    <option value="241">dejeuner 6 (siege)</option>
    <option value="288">dejeuner 7 (siege)</option>
    <option value="852">pique nique (gouter 1 siege)</option>
    <option value="507">diner 1 (siege)</option>
    <option value="883">test 20/09 (diner - siege)</option>
    <option value="136">Goûter 2 (siege)</option>
    <option value="134">Resident (pas dans CM)</option>
    <option value="24">pertes (diner - siege)</option>
    <option value="25">cessions (pas dans CM)</option>
    <option value="201">Taxes et Frais divers (pas dans CM)</option>
    <option value="227">Emballages (consignes et déconsignes)</option>
    <option value="135">Diners de luxe (pas dans CM)</option>
    <option selected="selected" value="320">ajustement de stock</option>
    <option value="334">autre</option>
    <option value="745">HAPPY</option>
    <option value="876">consommation</option>
    <option value="802">test AB Cons 3105 01</option>
    <option value="869">panier repas (pas dans CM)</option>
    <option value="915">1 dest. siege</option>
    <option value="953">collation de 11h</option>

</select>

但是当我尝试更改我的值或我的项目时,我会再次调用我的事件,但是选择了值,也是无限循环...

你有什么想法吗?

感谢您的回答!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    在您的事件处理程序中,只需执行以下操作:

    ddl.ClearSelection();
    

    另外,请确保在 Page_Load 中对 if(!isPostBack) 块中的值进行数据绑定,以防止出现意外结果。

    在 cmets 之后更新:

    正如我所说,您需要某种对原始值的持久性。有几种方法可以做到这一点:

    1.)SelectedIndexChanged事件中做你的比较操作,如果他不能做,则查询数据库获取原始值并用它在下拉列表中选择它

    2.) 在绑定下拉列表时存储这些原始值,可能在这样的字典中:

    var collectionToBindTo = Db.GetMyItems();
    Dictionary<int, string> originalValues; 
    foreach (var item in collectionToBindTo)
    {
        originalValues.Add(item.Id, item.SomeValue);
    } 
    dropdownlist.DataSource = collectionToBindTo;
    dropdownlist.DataBind();
    // now add the collection to the session
    

    其中 int 是键(可能是项目的 Id?),字符串是原始值。然后,您必须将这个集合存储在 Session 中,这样您就可以在回发之间检索它,而无需重新查询数据库。

    我猜你在你的 aspx 文件中使用了一个元素 DataSource,所以第二个对你来说很难做到。你可以做的是使用第一个选项,如果你不经常访问数据库,这真的很容易。

    希望这是有道理的。这不是复制和粘贴解决方案,您需要更改这些想法以满足您的需求。

    【讨论】:

    • 好吧,ClearSelection,我认为它是解决方案,但问题仍然存在。事实上, var ddl = sender as DropDownList;包含新选择的值,而不是我尝试获取的旧值。
    • @blasil64,你想得到什么旧值?你的问题不是很清楚,或者我只是不明白。您有一个充满项目的列表视图,每个项目都有其包含相同项目的下拉列表。用户更改下拉列表中的选择,您想做什么?检查用户是否可以执行该操作,如果不能,则回滚更改?当然,你在回发后得到了新的值,这就是使用这个事件的全部原因。如果您需要获得一些旧值,则需要某种方式来坚持/找出它。
    • 你低估了我的期望。我的下拉列表包含值,目前有一个选定的值,这是我的“旧值”。我想更改所选项目,我选择一个“新值”。我通过了我的活动。如果我所有的规则和约束都得到尊重,那没关系。要么,我想回滚(选择旧值)。清楚吗 ?感谢您的帮助!
    • @blasil64,我们会看看这是否清楚 :) 看看我的更新,希望它对你有用。
    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 2014-02-20
    • 2013-09-13
    • 2016-09-05
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多