自定义ASPX中继器不更新数据库(正在重置值)

时间:2018-09-26 09:54:48

标签: c# asp.net aspx-user-control

当涉及到ASPX和页面生命周期时,我非常菜鸟,我确定这是我的问题。我正在构建一个自定义中继器,该中继器可基于DataTable行和模板动态创建控件。代码非常简单,根据我的调试,很明显错误是在运行Button.OnClick方法并生成更新查询之前,正在重置具有旧值的动态创建的TextBox。

基本用法:

  1. OnInit()。声明DataRepeaterSample控件。
  2. OnInit()。将模板文本框添加到DataRepeaterSample。
  3. OnInit()。设置表DataRepeaterSample.Table = DataTable。在此处为DataTable中的每一行创建动态控件。
  4. Button_Click()。 “单击按钮”事件将运行DataRepeaterSample.Save()方法。这将为每个DataRow生成一个SQL查询,并为相对行的文本框添加参数。问题在于,在生成和执行更新查询之前,将重置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;
    }
}
}

0 个答案:

没有答案