我正在尝试使用此单击事件在页面上找到我的控件。
编辑澄清:用户将输入一个贷款号码并按下 btnLoanNumber_Click 这将在 tern 调用数据库并用信息填充文本框。然后用户将通过按 btnEnter_1_Click 来更新文本框。
编辑更新:我添加了这行代码以查看如果在创建控件之前清除控件会发生什么情况,我收到以下错误:具有相同 ID 的多个控件
我不明白。我使用 UpdatePanel 是否重要?
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
PlaceHolder1.Controls.Clear();
CreateControls();
}
这一切看起来都很简单,但我相信状态是原因,我不知道如何解决这个问题。
protected void btnLoanNumber_Click(object sender, EventArgs e)
{
// Hydrate properties with Pricing class properties (Pricing DB column names)
PropertyInfo[] properties = type.GetProperties();
LoanNumber = tbxLoanNumber.Text;
Session["LoanNumber"] = LoanNumber;
for (int i = 0; i < NumberOfControls; i++)
{
if (properties[i].GetValue(PricingByLoanNumber, null) != null)
{
string id = "tbx" + properties[i].Name;
var tbx = (TextBox)PlaceHolder1.FindControl(id);
tbx.Text = properties[i].GetValue(PricingByLoanNumber).ToString();
}
}
}
tbx 始终为空。看起来很奇怪的是,如果我尝试在该事件中创建控件,我会收到错误,因为找到了多个具有相同 ID 的控件。我缺少什么以及如何找到我的控件?
这是后面的整个代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Servicing_Fix.Model;
using Servicing_Fix.DAL;
using System.Data;
using System.ComponentModel;
using System.Reflection;
namespace Servicing_Fix
{
public partial class Servicing_Fix : System.Web.UI.Page
{
private string loanNumber = "";
// Get Pricing Metadata
Type type = typeof(Pricing);
#region Properties
protected Pricing PricingByLoanNumber
{
get { return GetPricingByLoanNumber(LoanNumber); }
}
protected string LoanNumber
{
get { return loanNumber.Replace(",", ""); }
set { loanNumber = value.Replace(",", ""); }
}
protected int NumberOfControls
{
get { return type.GetProperties().Count(); }
}
#endregion
#region Page Events
protected void Page_Init(object sender, EventArgs e)
{
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
CreateControls();
}
else
{
if (Session["LoanNumber"] != null)
{
LoanNumber = Session["LoanNumber"].ToString();
}
}
}
protected void btnLoanNumber_Click(object sender, EventArgs e)
{
// Hydrate properties with Pricing class properties (Pricing DB column names)
PropertyInfo[] properties = type.GetProperties();
LoanNumber = tbxLoanNumber.Text;
Session["LoanNumber"] = LoanNumber;
for (int i = 0; i < NumberOfControls; i++)
{
if (properties[i].GetValue(PricingByLoanNumber, null) != null)
{
string id = "tbx" + properties[i].Name;
var tbx = (TextBox)PlaceHolder1.FindControl(id);
tbx.Text = properties[i].GetValue(PricingByLoanNumber).ToString();
}
}
}
protected void btnEnter_1_Click(object sender, EventArgs e)
{
// Hydrate properties with Pricing class properties (Pricing DB column names)
PropertyInfo[] properties = type.GetProperties();
for (int i = 0; i < NumberOfControls; i++)
{
var tbx = (TextBox)PlaceHolder1.FindControl("tbx" + properties[i].Name);
if (tbx != null)
{
properties[i].SetValue(PricingByLoanNumber, tbx.Text);
}
}
UpdatePricingByLoanNumber(LoanNumber, PricingByLoanNumber);
tbxLoanNumber.Text = "";
}
#endregion
#region Helpers
private Pricing GetPricingByLoanNumber(string loanNumber)
{
var pricingDAL = new PricingDAL();
return pricingDAL.GetPricingByLoanNumber(loanNumber);
}
private void UpdatePricingByLoanNumber(string loanNumber, Pricing pricing)
{
var pricingDAL = new PricingDAL();
pricingDAL.UpdatePricingByLoanNumber(loanNumber, pricing);
}
private void CreateControls()
{
// Hydrate properties with Pricing class properties (Pricing DB column names)
PropertyInfo[] properties = type.GetProperties();
// Dynamically create labels and textbox controls
for (int i = 0; i < NumberOfControls; i++)
{
Label lbl = new Label();
TextBox tbx = new TextBox();
lbl.ID = "lbl" + properties[i].Name;
tbx.ID = "tbx" + properties[i].Name;
lbl.Text = properties[i].Name;
PlaceHolder1.Controls.Add(lbl);
PlaceHolder1.Controls.Add(tbx);
PlaceHolder1.Controls.Add(new LiteralControl("<br />"));
}
}
#endregion
}
}