【问题标题】:Listbox Bug with SelectedIndex and Value?带有 SelectedIndex 和值的列表框错误?
【发布时间】:2013-08-22 09:33:12
【问题描述】:

我想我在使用列表框时发现了一个错误。 示例:带有 Editbutton 的 ListBox 将其加载到特殊字段中:

列表框有 4 个项目:

  1. 电话号码:+15454545(值 2)(索引 0)
  2. 电子邮件:Test@testmail.com(值 1)(索引 1)
  3. 传真号码:+1515515151(值 3)(索引 2)
  4. 电子邮件:Test2@testmail.com(值 1)(索引 3)

然后是editbuttoncode:

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 项时,它会使用第二项中的所有数据,即使它们具有不同的索引!

值是否影响此处的索引,如果是,为什么?! 这对我来说确实是个问题,因为我需要将联系人类型存储在值中。 (1 = 电子邮件,2 = 电话等);

谢谢!

编辑: 澄清一下:Edit-Button 是 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 以获得更多说明(或其他):

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

当我调试时:

第4项没有被选中……即使你在之前的图片中看到,也是!!

如果我查看 ListBoxKOFC 本身:

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

但正如您在 4. Screenshot 中看到的那样 -> 我要编辑的项目的索引是 3。 只有值是相同的。 但是为什么值不能相同,索引总是另一个...

该值是否在此处用作索引?! (不可能,但 atm 我不确定了......)还是价值只是被窃听了?

【问题讨论】:

  • ListBox with Editbutton??
  • Ups,EditButton 本身就是 ListItem 之外的一个 Button。我会更新问题。
  • @DatRid: 好的,但只有我一个人不明白这个问题吗?你想达到什么目的? ListBox.SelectedValue 返回 first 选定项的值。因此,如果全部选中,它总是返回第一项的值。另一方面,DropDownList 只有单选。因此,如果它包含相同的项目,也会选择第一个项目。我也不明白 LiustBox-Items 中的索引和值的含义。
  • @Tim Schmelter:嗯,我总是只选择一项,而不是更多!
  • @TimSchmelter:我刚刚写下了列表框是如何填充的。

标签: c# asp.net listbox


【解决方案1】:

是的。您的问题是有两个具有相同值的项目。 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 引擎会为您的页面创建一个新实例,并应用请求中的视图状态。当它尝试重新创建下拉控件时,它会搜索具有正确值的选项并在找到时停止。

【讨论】:

  • 啊...这很可悲。好吧,至少我能找到一个简单的解决方法......谢谢!
  • 我记得几年前我尝试做类似的事情时也有同样的感觉。
【解决方案2】:

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

但这可能不是你的情况。

【讨论】:

  • 感谢您的回答,但我根本没有设置 sortproperty。我会检查它的默认值是 true 还是 false ;)
  • 好的,我的列表框中根本没有 sortproperty,但是谢谢!
  • 糟糕。我以为你的意思是 Windows 窗体 ListBox 控件。
  • 我也不明白你的问题。有一个 ListBoxKOFC,但 DropDownListKOFC 是什么?你的代码哪里出了问题?
  • 不,正如您在标签中看到的那样,它的 asp.net :) 我会进一步澄清:D
【解决方案3】:

首先,列表框中不应该有两个具有相同值的项目。如果你必须有重复的值,那么你不能使用值作为条件。

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

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;
    }
}

【讨论】:

  • 嗯 - 这将是一个问题以后......但目前它已经在string value = ListBoxKOFC.SelectedValue; Session["EditID"] = ListBoxKOFC.SelectedIndex;选择了错误的项目@就像比尔说的那样;)但是谢谢!
【解决方案4】:

感谢其他人帮助我理解问题! 我将分享我的小工作,也许它会对某人有所帮助!

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

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

然后将其与值相加:

ListItem listitem = new ListItem(text, value + random.ToString(), true);
ListBox.Items.Add(listitem);

如果你需要它,只需使用子字符串:

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

但这只有在随机数前面的数字总是相同的情况下才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多