DropDownList OnSelectedIndexChanged -取消选中的值

本文关键字:取消 OnSelectedIndexChanged DropDownList | 更新日期: 2023-09-27 18:09:55

我有一个面板,它包含一个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允许知道是否找到了具有此值和约束的下拉列表。如果为true,我想取消下拉列表中选中的项

在错误信息后我能写什么?

我尝试了一些解决方案,但都无济于事。(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>

但是当我试图改变我的值或我的项目时,我调用另一次我的事件,但选择的值,也是无限循环…

你有什么主意吗?

谢谢你的回答!

DropDownList OnSelectedIndexChanged -取消选中的值

在你的事件处理程序中做这样的事情:

ddl.ClearSelection();

另外,确保在Page_Load中绑定if(!isPostBack)块中的值,以防止意外的结果。

更新后评论:

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

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 ?), string是原始值。然后,您必须将这个集合存储在Session中,这样您就可以在两次回发之间检索它,而不必重新查询数据库。

我猜你在aspx文件中使用元素数据源,所以第二个对你来说很难做到。您可以使用第一个选项,如果您不经常访问数据库,这个选项非常简单。

希望这有意义。这不是复制粘贴的解决方案,您需要更改这些想法以适应您的需要。