Я довольно нуб, когда дело доходит до ASPX и жизненных циклов страниц, и я уверен, что это моя проблема.Я создаю собственный повторитель, который динамически создает элементы управления на основе строк и шаблонов DataTable.Код довольно прост и на основе моей отладки ясно, что ошибка в том, что мои динамически созданные TextBox сбрасываются (со старыми значениями) до запуска метода Button.OnClick и генерируются запросы на обновление.
Основное использование:
- OnInit ().Объявите элемент управления DataRepeaterSample.
- OnInit ().Добавьте текстовые поля шаблона в DataRepeaterSample.
- OnInit ().Установить таблицу DataRepeaterSample.Table = DataTable.Здесь динамические элементы управления создаются для каждой строки в DataTable.
- 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;
}
}
}