Обновление элементов списка с помощью динамически создаваемого события нажатия кнопки при загрузке страницы. (Индекс был вне диапазона) - PullRequest
0 голосов
/ 24 января 2020

Привет. Я пытаюсь динамически создавать кнопки и текстовые поля из списка при загрузке моей страницы. К кнопкам прикреплено событие click, которое добавляет его в TextBox. В то же время это происходит, и я хочу обновить соответствующий элемент списка на новый номер.

Моя проблема в том, что я получаю сообщение об ошибке:

Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: index

Кажется, я не понимаю, почему я получаю ошибку и, следовательно, как я могу исправить свою проблему. Ниже я подготовил пример кода, воссоздающий проблему:

public partial class _Default : Page
{
    List<ProductRates> ProductRateList = new List<ProductRates>() {
        new ProductRates(1,"Test",0),
        new ProductRates(2,"Test2",0),
        new ProductRates(3,"Test3",0)
    };

    protected void Page_Load(object sender, EventArgs e)
    {

        for (int i = 0; i < ProductRateList.Count; i++)
        {
            double testing = ProductRateList[i].ProductOrderAmount;

            TextBox textBox = new TextBox();                
            textBox.Text = "0";
            textBox.ID = ProductRateList[i].ProductName + "TextBox";

            Button plusButton = new Button();               
            plusButton.Text = "+";
            plusButton.ID = ProductRateList[i].ProductName + "PinusButton";
            plusButton.Click += (se, ev) => PlusButton_Click(se, ev, ProductRateList,i, textBox);                             

            System.Web.UI.HtmlControls.HtmlGenericControl createButtonDiv =
            new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
            createButtonDiv.ID = ProductRateList[i].ProductName + "createButtonDiv";
            createButtonDiv.Attributes.Add("class", "col-md-6");
            createButtonDiv.Controls.Add(plusButton);
            createButtonDiv.Controls.Add(textBox);              

            ProductPlaceholderDiv.Controls.Add(createButtonDiv);

        }

    }
    void PlusButton_Click(Object sender, EventArgs e, List<ProductRates> ProductRateList, int i, TextBox textBox)
    {
        string test = textBox.Text;
        ProductRateList[i].ProductOrderAmount = 1 + double.Parse(test);
        textBox.Text = (ProductRateList[i].ProductOrderAmount).ToString();
    }

    public class ProductRates
    {            
        public ProductRates(int prodductId, string productName , double productOrderAmount  )
        {
            ProdductId = prodductId;
            ProductName = productName;
            ProductOrderAmount = productOrderAmount;
        }
        //Product
        public int ProdductId { get; set; }
        public string ProductName { get; set; }          
        public double ProductOrderAmount { get; set; }            
    }
}

Ответы [ 2 ]

1 голос
/ 24 января 2020

1) Использовать ниже новый обработчик событий =>

    private void PlusButton_Click1(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        System.Web.UI.HtmlControls.HtmlGenericControl div =(System.Web.UI.HtmlControls.HtmlGenericControl)btn.Parent;

        string ProductName = btn.ID.Substring(0, btn.ID.Length - "PinusButton".Length);

        TextBox txt = (TextBox)div.FindControl(ProductName + "TextBox");
        txt.Text = (Convert.ToInt32(string.IsNullOrEmpty(txt.Text)? "0":txt.Text) + 1).ToString();
    }

2) подписаться как =>

plusButton.Click + = PlusButton_Click1;

Upvote, если решение работает для вас .. спасибо .. наслаждайтесь кодированием

0 голосов
/ 24 января 2020

Я решил свою проблему с помощью ответа @RiteshKulkarni. Хотя, возможно, есть лучшее решение для этого, и, если кто-то знает ответ, пожалуйста, дайте мне знать.

Затем на событие click, которое отправил @RiteshKulkarni, я добавил oop, который проверяет, соответствует ли имя соответствующему один и используйте это, чтобы сохранить значение в списке.

Если кто-то знает лучший способ добиться этого, пожалуйста, дайте мне знать.

public partial class _Default : Page
{
    List<ProductRates> ProductRateList = new List<ProductRates>() {
        new ProductRates(1,"Test",0),
        new ProductRates(2,"Test2",0),
        new ProductRates(3,"Test3",0)
    };

    protected void Page_Load(object sender, EventArgs e)
    {

        for (int i = 0; i < ProductRateList.Count; i++)
        {
            double testing = ProductRateList[i].ProductOrderAmount;

            TextBox textBox = new TextBox();                
            textBox.Text = ProductRateList[i].ProductOrderAmount.ToString();
            textBox.ID = ProductRateList[i].ProductName + "TextBox";

            Button plusButton = new Button();               
            plusButton.Text = "+";
            plusButton.ID = ProductRateList[i].ProductName + "PinusButton";
            plusButton.Click += PlusButton_Click1;

            System.Web.UI.HtmlControls.HtmlGenericControl createButtonDiv =
            new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");
            createButtonDiv.ID = ProductRateList[i].ProductName + "createButtonDiv";
            createButtonDiv.Attributes.Add("class", "col-md-6");
            createButtonDiv.Controls.Add(plusButton);
            createButtonDiv.Controls.Add(textBox);              

            ProductPlaceholderDiv.Controls.Add(createButtonDiv);

        }

    }
    private void PlusButton_Click1(object sender, EventArgs e)
    {

        Button btn = (Button)sender;
        System.Web.UI.HtmlControls.HtmlGenericControl div = (System.Web.UI.HtmlControls.HtmlGenericControl)btn.Parent;

        string ProductName = btn.ID.Substring(0, btn.ID.Length - "PinusButton".Length);

        TextBox txt = (TextBox)div.FindControl(ProductName + "TextBox");           
        for (int i = 0; i < ProductRateList.Count; i++)
        {
            if (ProductRateList[i].TextBoxName == ProductName + "TextBox")
            {
                ProductRateList[i].ProductOrderAmount = double.Parse(txt.Text) + 1;
                txt.Text = ProductRateList[i].ProductOrderAmount.ToString();
            }
        }

    }

    public class ProductRates
    {            
        public ProductRates(int prodductId, string productName , double productOrderAmount  )
        {
            ProdductId = prodductId;
            ProductName = productName;
            ProductOrderAmount = productOrderAmount;
        }
        //Product
        public int ProdductId { get; set; }
        public string ProductName { get; set; }          
        public double ProductOrderAmount { get; set; }
        public string TextBoxName { get; set; }
    }
}
...