Повторяющиеся идентификаторы панели / списка при воссоздании моего списка (ов) элементов управления - PullRequest
0 голосов
/ 06 марта 2012

Когда я нажимаю кнопку «Удалить», я намерен удалить Панель, затем перебрать оставшиеся панели и присвоить им новый идентификатор с нуля. если бы я удалил Panel (3) из списка из 6 панелей, я бы перебрал и дал им все новые идентификаторы Panels 0-5.

Моя проблема в том, что я продолжаю сталкиваться с ошибкой после того, как удаляю панель, где у меня есть дубликаты имен ID. Что касается моей жизни, я не могу видеть, где я иду не так, поэтому я протягиваю руку, надеясь, что я просто слепой или за советом.

Я устанавливал точку останова в своей функции btnDelete и проходил через нее, но не вижу своего логического недостатка в том, почему у меня возникает проблема с несколькими панелями с одинаковым идентификатором.

ASPX:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage/MasterPage.master" AutoEventWireup="true" CodeFile="Search.aspx.cs" Inherits="Search" EnableTheming="true" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
<link href="App_Themes/ui-lightness/jquery-ui-1.7.2.custom.css" rel="stylesheet"
    type="text/css" />
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"
    rel="stylesheet" type="text/css" />
<script src="Includes/JavaScript/jquery-1.7.1.js" type="text/javascript"></script>
<script src="Includes/JavaScript/jquery.ui.datepicker.js" type="text/javascript"></script>
<script src="Includes/JavaScript/jquery.ui.widget.js" type="text/javascript"></script>
<script src="Includes/JavaScript/jquery.ui.core.js" type="text/javascript"></script>
<%--Script for the Dropdown Datepicker--%>
<script type="text/javascript">
    $(function () {
        $("input.datepicker").datepicker({ showOn: 'button', buttonImage: 'Includes/Images/calender.gif', buttonImageOnly: false, onSelect: function () { }
        });
    });
</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" runat="Server">
<h1>
    Search
    <asp:HyperLink ID="HyperLink1" runat="server" ImageUrl="Includes/Images/action_help.gif"
        NavigateUrl="~/user_manual.pdf" Target="_blank" ToolTip="Search Help"></asp:HyperLink></h1>
<table border="0" cellpadding="6" cellspacing="0">
<tr>
<td>
    <asp:Button ID="btnAdd" runat="server" Text="Add Control" onclick="btnAdd_Click" />
    <asp:Button ID="btnClear" runat="server" Text="Reset" onclick="btnClear_Click" />
    <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" />

</td>
<td>
    <asp:TextBox ID="txtTitle" class="searchPage" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
<asp:PlaceHolder ID="myPlaceholder" runat="server"></asp:PlaceHolder>
</td>

Код:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Runtime.Serialization;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

public partial class Search : BasePage
{
    List<Users> userroles = new List<Users>();
    //Panel that contains all our Dynamically added user controls.
    List<Panel> persistControls = new List<Panel>();

    public int userid = 0;
    public byte IsActive = 1;
    public int error = 0;

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
}

// Calls three functions responsible for pulling from the Database and binding the Datagrid.
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        GetClustersFromDB(userid);
        BindGrid();
        BindState();         
    }
    else
    {
        // Where I am recreating my controls.
        DynamicQueryRecreateLogic();
    }
}

protected void DynamicQueryRecreateLogic()
{
    if (Session["persistControls"] != null)
    {
        // Local Value that contains the members of the current persistControls session, not yet pushed to the page.
        persistControls = (List<Panel>)Session["persistControls"];
        int count = 0;

        foreach (Panel panel in persistControls)
        {
            //AddQuestionTypeDropDownList(count);
            panel.ID = "panel" + "(" + count.ToString() + ")";

            foreach (Control control in panel.Controls)
            {
                if (control.GetType() == typeof(DropDownList))
                {
                    control.ID = "list" + "(" + count.ToString() + ")";
                    DropDownList list = (DropDownList)panel.FindControl(control.ID);
                    list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
                }
                if (control.GetType() == typeof(TextBox))
                {
                   control.ID = "txtBox" + "(" + count.ToString() + ")";
                }
            }

            // Re-Adding our Remove Button
            Button btnRemove = new Button();
            btnRemove.Click += new EventHandler(btnDelete_Click);
            btnRemove.Text = "Remove";
            btnRemove.CommandArgument = count.ToString();

            // Pushing to Placeholder
            myPlaceholder.Controls.Add(panel);
            myPlaceholder.Controls.Add(btnRemove);
            count++;
        }
    }
}

private DropDownList AddQuestionTypeDropDownList()
{
    DropDownList list = new DropDownList();

    list.ID = "list" + "(" + persistControls.Count.ToString() + ")";
    list.Items.Add(new ListItem("--Select One--", ""));
    list.Items.Add(new ListItem("Title", "1"));
    list.Items.Add(new ListItem("Contact", "2"));
    list.Items.Add(new ListItem("Date Created", "3"));
    list.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
    list.AutoPostBack = true;

    return list;
}

private TextBox AddFieldTypeTextBox(int count)
{
    TextBox box = new TextBox();
    box.ID = "txtBox" + "(" + count.ToString() + ")";
    return box;
}

protected void btnAdd_Click(object sender, EventArgs e)
{
    try
    {
        Panel panelContainer = new Panel();
        panelContainer.ID = "panel" + "(" + persistControls.Count.ToString() + ")";

        panelContainer.Controls.Add(AddQuestionTypeDropDownList());

        Button btnRemove = new Button();
        btnRemove.Click += new EventHandler(btnDelete_Click);
        btnRemove.Text = "Remove";
        btnRemove.CommandArgument = persistControls.Count.ToString();

        persistControls.Add(panelContainer);

        myPlaceholder.Controls.Add(panelContainer); // Pushes the Panel to the page.
        myPlaceholder.Controls.Add(btnRemove); // Pushes our Button to the page.

        Session["persistControls"] = persistControls; // put it in the session
    }
    catch
    {
        throw;
    }
}

protected static string DecipherCountNumber(string IDHolder)
{
    int start = IDHolder.IndexOf("(");

    if (start == -1)
    {
        return IDHolder;
    }
    else
    {
        return IDHolder.Substring(start + 1).Replace(")", string.Empty);
    }
}

protected void list_SelectedIndexChanged(object sender, EventArgs e)
{
    //I need to fix the dynamic Add location. I need to track some type of enumeration or attributes of the panel for recreation.
    try
    {
        DropDownList list = (DropDownList)sender;
        string IDHolder = list.ID.ToString();
        int count = Convert.ToInt32(DecipherCountNumber(IDHolder));
        Panel panelContainer = persistControls.Find(delegate(Panel panel) { return panel.ID == "panel" + "(" + count.ToString() + ")"; });

        if (list.SelectedIndex == 1)
        {
            //panelContainer.Controls.Add(AddFieldTypeTextBox(count));
        }
        if (list.SelectedIndex == 2)
        {
            //panelContainer.Controls.Remove(FindControl("txtBox" + "(" + count.ToString() + ")"));
        }
        if (list.SelectedIndex == 3)
        {
            //panelContainer.Controls.Remove(FindControl("txtBox" + "(" + count.ToString() + ")"));
        }

        Session["persistControls"] = persistControls;
    }
    catch
    {
        throw;
    }
}

protected void btnClear_Click(object sender, EventArgs e)
{
    try
    {
        Session["persistControls"] = null;
        Response.Redirect(Request.Url.ToString());
    }
    catch
    {
        throw;
    }
}

protected void btnDelete_Click(object sender, EventArgs e)
{
    try
    {
        int deleteThisOne = int.Parse(((Button)sender).CommandArgument);
        persistControls.Remove(persistControls[deleteThisOne]);

        Session["persistControls"] = persistControls;

        Response.Redirect(Request.Url.ToString(), false);
    }
    catch
    {
        throw;
    }
}

1 Ответ

0 голосов
/ 13 марта 2012

Я изменил свои DynamicQueryControls, чтобы делать воссоздание OnInit, а не в PageLoad.При создании этого на уровне PageLoad возникает немало проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...