带有SelectedIndex和Value的Listbox Bug?

时间:2013-08-22 09:33:12

标签: c# asp.net listbox

我想我在使用Listbox时发现了一个错误。 示例:带有编辑按钮的ListBox,将其加载到特殊字段中:

列表框有4个项目:

  1. 电话号码:+15454545(值2)(索引0)
  2. 电子邮件:Test@testmail.com(值1)(索引1)
  3. FaxNumber:+1515515151(Value 3)(Index 2)
  4. 电子邮件:Test2@testmail.com(值1)(索引3)
  5. 然后编辑按钮代码:

    protected void EditKOFC(object sender, EventArgs e)
        {
            try
            {
                if (ListBoxKOFC.SelectedItem == null)
                {
                    LabelMPE.Text = "Please select first!";
                    ModalPopupExtender1.Show();
                }
                else
                {
    
                    string value = ListBoxKOFC.SelectedValue;
                    Session["EditID"] = ListBoxKOFC.SelectedIndex;
                    string[] meineStrings = ListBoxKOFC.SelectedItem.Text.Split(new Char[] { ':' });
                    string text = meineStrings[1];
                    string text2 = text.Substring(1);
                    TextBoxKOFC.Text = text2;
    
                    foreach (ListItem item in DropDownListKOFC.Items)
                    {
                        item.Selected = false;
                        if (item.Value == value)
                        {
                            item.Selected = true;
                        }
                    }
                    editing = true;
                    AddKOFC.Text = "Save";
                }
            }
            catch (Exception ex)
            {
                GlobalFunctions.Error_Log(ex, ex.TargetSite.ToString());
            }
        }
    

    我得到了问题。 当我选择前三项时,一切都很好。当我选择第4项时,它会使用第二项中的所有数据,即使它们具有不同的索引!

    值是否会影响指数,如果是,为什么?! 它对我来说真的是一个问题,因为我需要在值中存储contacttype。 (1 =电子邮件,2 =电话等);

    全部谢谢!

    编辑: 澄清一下:编辑按钮是ListBox外部的一个Button。

    <asp:TableRow>
                <asp:TableCell>
                    <asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UpdatePanel2">
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="AddKOFC" EventName="Click" />
                        </Triggers>
                        <ContentTemplate>
                            <asp:DropDownList runat="server" ID="DropDownListKOFC" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </asp:TableCell>
                <asp:TableCell>
                    <asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UpdatePanel1">
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="AddKOFC" EventName="Click" />
                        </Triggers>
                        <ContentTemplate>
                            <asp:TextBox runat="server" ID="TextBoxKOFC" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </asp:TableCell><asp:TableCell>
                    <asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UP2">
                        <ContentTemplate>
                            <asp:Button runat="server" ID="AddKOFC" OnClick="AddContactInformation" Text="Add Contactinformation" />
                            <asp:HiddenField ID="HFAdd" runat="server" />
                            <ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" BackgroundCssClass="modalBackground"
                                TargetControlID="HFAdd" PopupControlID="PanelChoose" BehaviorID="MPEchoose">
                            </ajaxToolkit:ModalPopupExtender>
                            <asp:Panel ID="PanelChoose" runat="server" BorderStyle="Solid" BackColor="ButtonShadow">
                                <asp:Label ID="LabelMPE" runat="server"></asp:Label>
                                <asp:Table ID="Table3" runat="server">
                                    <asp:TableRow>
                                        <asp:TableCell>
                                            <asp:Button ID="ButtonOK" runat="server" Text="Ok" />
                                        </asp:TableCell>
                                    </asp:TableRow>
                                </asp:Table>
                            </asp:Panel>
                        </ContentTemplate>
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="AddKOFC" EventName="Click" />
                            <asp:AsyncPostBackTrigger ControlID="ButtonOK" EventName="Click" />
                        </Triggers>
                    </asp:UpdatePanel>
                </asp:TableCell></asp:TableRow>
            <asp:TableRow>
                <asp:TableCell>
                    <asp:Label ID="Label13" runat="server"></asp:Label>
                </asp:TableCell></asp:TableRow>
            <asp:TableRow>
                <asp:TableCell>
                    <asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UP3">
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="AddKOFC" EventName="Click" />
                        </Triggers>
                        <ContentTemplate>
                            <asp:ListBox runat="server" ID="ListBoxKOFC" ToolTip="The way to contact this person">
                            </asp:ListBox>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </asp:TableCell><asp:TableCell>
                    <asp:Button ID="ButtonUpdate" runat="server" Text="Edit" OnClick="EditKOFC" />
                </asp:TableCell><asp:TableCell>
                    <asp:Button ID="ButtonDelete" runat="server" Text="Delete" OnClick="DeleteKOFC" />
                </asp:TableCell></asp:TableRow>
            <asp:TableRow>
    

    Edit2以获得更多说明(或其他):

    enter image description here

    这就是它的样子。 然后我想编辑第4项:

    enter image description here

    当我调试时:

    enter image description here

    未选择第4项......即使您在图片中看到它,也是!!

    如果我查看ListBoxKOFC本身:

    enter image description here

    代码完成后,选择了错误的项目并加载到编辑中:

    enter image description here

    但正如你在4.截图中看到的那样 - &gt;我要编辑的项目的索引是三。 只有价值是一样的。 但为什么价值不一样,指数又是另一个......

    这里的价值是否有效? (不可以,但我现在还不确定......)或者价值只是被窃听?

4 个答案:

答案 0 :(得分:2)

是的。您的问题是有两个具有相同值的项目。 ASP.Net下拉列表作为标准HTML选择控件呈现给浏览器,格式为:

<select name="cars">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="fiat">Fiat</option>
<option value="audi">Audi</option>
</select>

http://www.w3schools.com/html/tryit.asp?filename=tryhtml_select2

每个选项都应该具有唯一值。

请记住,当回发发生时,ASP.Net引擎会创建页面的新实例并应用请求中带来的视图状态。当它尝试重新创建下拉控件时,它会搜索具有正确值的选项,并在找到时停止。

答案 1 :(得分:1)

我想我曾经遇到过这个问题。事实证明,您无法将ListBox排序属性设置为true;否则索引将毫无用处。

但这可能不是你的情况。

答案 2 :(得分:0)

首先,列表框中不应该有2个具有相同值的项目。如果必须具有重复值,则不能将value用作条件。

Asp .Net不会将Value工作视为索引。您的代码使用值作为错误的条件(参见下文)。

if (item.Value == value)
{
    item.Selected = true;
}

<强>解决方案: 您需要使用索引作为条件。请尝试以下代码:

for (int i = 0; i < DropDownListKOFC.Items.Count; i++)
{
    DropDownListKOFC.Items[i].Selected = false;

    if (i == ListBoxKOFC.SelectedIndex)
    {
      DropDownListKOFC.Items[i].Selected = true;
    }
}

答案 3 :(得分:0)

感谢其他人帮助我理解这个问题! 我将分享我的小工作,也许它会帮助别人!

在加载时为当前值添加随机值:

Random rnd = new Random();
int random = rnd.Next(1,1000000);

然后使用值

将其添加到togheter
ListItem listitem = new ListItem(text, value + random.ToString(), true);
ListBox.Items.Add(listitem);

如果你需要它,只需使用substring:

string value = ListBox.SelectedValue;
value = value.Substring(0, 1);

但是只有在随机数量不等的情况下,这才会有效。