4

我想我在使用列表框时发现了一个错误。示例:带有 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 项时,它会使用第二项中的所有数据,即使它们有不同的索引!

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

已经谢谢了!

编辑:澄清:编辑按钮是列表框外的按钮本身。

<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项没有被选中……即使你在之前的图片中看到,它也是!

如果我查看 ListBoxKOFC 本身:

在此处输入图像描述

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

在此处输入图像描述

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

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

4

4 回答 4

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

于 2013-08-27T07:07:24.690 回答
1

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

但这可能不是你的情况。

于 2013-08-22T09:37:39.307 回答
0

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

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;
    }
}
于 2013-08-27T07:31:13.750 回答
0

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

加载时将随机值添加到当前值:

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

但这只有在随机数前面总是有相同数量的数字时才有效。

于 2013-08-29T07:43:25.460 回答