Пользовательский ретранслятор ASPX не обновляет базу данных (сбрасываются значения) - PullRequest
0 голосов
/ 26 сентября 2018

Я довольно нуб, когда дело доходит до ASPX и жизненных циклов страниц, и я уверен, что это моя проблема.Я создаю собственный повторитель, который динамически создает элементы управления на основе строк и шаблонов DataTable.Код довольно прост и на основе моей отладки ясно, что ошибка в том, что мои динамически созданные TextBox сбрасываются (со старыми значениями) до запуска метода Button.OnClick и генерируются запросы на обновление.

Основное использование:

  1. OnInit ().Объявите элемент управления DataRepeaterSample.
  2. OnInit ().Добавьте текстовые поля шаблона в DataRepeaterSample.
  3. OnInit ().Установить таблицу DataRepeaterSample.Table = DataTable.Здесь динамические элементы управления создаются для каждой строки в DataTable.
  4. Button_Click ().При нажатии кнопки «Событие» запускается метод DataRepeaterSample.Save ().Это генерирует SQL-запрос с указанием DataRow и добавлением параметров для текстовых полей относительной строки.Проблема заключается в том, что TextBox.Text сбрасывается (со старыми значениями таблицы) до того, как запросы на обновление будут сгенерированы и выполнены.

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

Заранее спасибо.Я включил пример кода ниже.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace UltimaWeb.Controls
{
[ToolboxData("<{0}:DataRepeaterSample runat=server>    </{0}:DataRepeaterSample>")]
public class DataRepeaterSample : WebControl
{

    public DataTable Table
    {
        get
        {
            //return _DataTable;
            DataTable s = (DataTable)ViewState["Table"];
            return s;
        }

        set
        {
            ViewState["Table"] = value;

            GenerateControls();
        }
    }





    List<Control> _ControlTemplates = new List<Control>();
    public List<Control> ControlTemplates
    {
        get
        {

            return _ControlTemplates;
        }
    }

    void GenerateControls()
    {
        //if (Controls.Count > 0) return;
        if (Table == null) return;

        Debug.WriteLine(">>Generate Controls: Rows:" + Table.Rows.Count + " Templates:" + ControlTemplates.Count.ToString());

        this.Controls.Clear();

        var rowIndex = 0;
        foreach (DataRow row in Table.Rows)
        {
            foreach (Control c in ControlTemplates)
            {
                var id = "Row::" + rowIndex + ";;";

                if (c.GetType() == typeof(TextBox))
                {
                    var temp = (TextBox)c;
                    var a = new TextBox();
                    a.ID = temp.ID + id;
                    a.MaxLength = temp.MaxLength;


                    a.Text = temp.Text;

                    //Get values from row
                    if (a.Text.uContains("@:", ":@"))
                        a.Text = row[a.Text.uSelectBetween("@:", ":@")].ToString();


                    this.Controls.Add(a);
                }
                else if (c.GetType() == typeof(Literal))
                {
                    var temp = (Literal)c;
                    var l = new Literal() { ID = temp.ID + id, Text = ((Literal)c).Text };
                    this.Controls.Add(l);
                }
            }

            rowIndex++;
        }
    }

    /// <summary>
    /// Example: Update [Users] SET [Surname] = [[Surname]], [Name] = [[Name]] WHERE [No] = [[No]]
    /// </summary>
    public void Save(SqlCommand comm, SqlConnection conn)
    {
        //Example:
        for (int i = 0; i < Table.Rows.Count; i++)
        {
            DataRow row = Table.Rows[i];

            var columnsVariables = uRegex.FindMatches("@:" + uRegex.ExpressionCollection.AnyString + ":@", comm.CommandText);

            foreach (System.Text.RegularExpressions.Match m in columnsVariables)
            {
                var varName = m.Value.uSelectBetween("@:", ":@");
                uDebug.WriteLine(m.Value + ": varName: " + varName);

                //Find its control
                var c = FindControl(i, varName);
                if (c != null)
                {
                    comm.Parameters.AddWithValue("@" + varName, c.Text);
                    comm.CommandText = comm.CommandText.Replace(m.Value, "@" + varName);
                }
                else
                {
                    //Check for column if in talbe if control not found
                    comm.Parameters.AddWithValue("@" + varName, row[varName]);
                    comm.CommandText = comm.CommandText.Replace(m.Value, "@" + varName);
                }

            }

            Debug.WriteLine(">>" + comm.CommandText);
            foreach (SqlParameter par in comm.Parameters)
            {
                Debug.WriteLine(par.ParameterName + ":" + par.Value.ToString());
            }
            comm.uExecuteNoneQuery(conn);
        }


    }

    TextBox FindControl(int rowIndex, string id)
    {
        foreach (Control c in this.Controls)
        {
            if (c.ID.uContains(id, "Row::" + rowIndex + ";;"))
                return c as TextBox;
        }

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