c# - 如何为 C# 编码文件中表格列内的文本框控件赋值?
问题描述
我正在创建 asp.net 网络表单。因为我正在创建动态表,其中特定列是数字文本框控件。我不知道如何从文本框控件分配和获取值..我的编码如下..
for (int i = 0; i < my_DataTable.Rows.Count; i++)
{
HtmlTableRow _Row = new HtmlTableRow();
HtmlTableCell Col = new HtmlTableCell();
Col.InnerText = my_DataTable.Rows[i]["itmCode"].ToString();
_Row.Controls.Add(Col);
Col = new HtmlTableCell();
_Row.Controls.Add(Col);
Col.InnerHtml = "<input type='number' value='0'>";
_Row.Controls.Add(Col);
my_Table.Rows.Add(_Row);
}
在一个特定的方法中,我需要将值分配给文本框控件还需要获取现有值的值..所以我尝试如下操作
var no_1 = my_Table.Rows[0].Cells[1].InnerText;
如果我检查 no_1,它有文本框,但我不知道如何访问当前值并分配新值.. 谁能帮我实现这个..
解决方案
使用动态控件时必须记住的一件事是,每当postback
发生 a 时,您都会丢失动态创建的控件(因为回发调用Page_load()
事件,因此如果在加载事件中没有它们,它们将不会生成因此不会显示。)。因此,最好在加载事件中重新渲染控件。
因此,为了获得动态分配的控件(HTML
或Asp.net
)的值,我将这样做。
首先,创建一个持有者,用于将控件存储在页面中runat="server"
(因此,您可以在后端访问该控件)。在您的情况下,该控件是my_Table
. 然后使用Session/ViewState
来跟踪所有创建的动态控件,这些控件可用于将控件的值重新渲染为:
要在页面中添加新控件,如下所示:
var cnt = _findRelated("txtDynamic") + 1; //for all the dynamic text boxes i am using the prefix of txtDynamic just to keep SOC.
var nId = $"txtDynamic-{cnt}";
var _ctrl = new HtmlInputText("Integer")
{
Name = nId,
ID = nId,
//Value="Default Value" //uncomment to assign a default value
};
_ctrl.Attributes.Add("runat", "server");
var row = new System.Web.UI.HtmlControls.HtmlTableRow();
var newCell = new HtmlTableCell();
newCell.Controls.Add(_ctrl);
row.Cells.Add(newCell);
my_Table.Rows.Add(row);
Session.Add(cnt.ToString(), _ctrl); //here i am using session to manage the controls but you can also use the ViewState
在上面的代码中,我使用它的构造函数HtmlInputText
生成一个<input type="number"></input>
带有类型字符串的更多内容,可以在以下位置阅读:HtmlInputText。
该_findRelated()
方法用于获取附加到Form
. 它被定义为:
private int _findRelated(string prefix)
{
string reqstr = Request.Form.ToString();
return ((reqstr.Length - reqstr.Replace(prefix, "").Length) / prefix.Length);
}
要设置动态添加的控件的值,我们可以执行以下操作(如果未在创建时分配):
var cell = my_Table.Rows[_myTable.Rows.Count-1].cells[0]; //here i have assumed it is in the last row and in the first cell you can change the index to be anything.
var txtDynamic = cell.Controls.OfType<HtmlInputText>().FirstOrDefault();//getting the control
txtDynamic.Value = "<Some thing new>"; //setting the value
现在,要获得分配的值:
var cell = my_Table.Rows[_myTable.Rows.Count-1].cells[0]; //here i have assumed it is in the last row and in the first cell you can change the index to be anything.
var txtDynamic = cell.Controls.OfType<HtmlInputText>().FirstOrDefault();//getting the control
//now use the .Value property of the control to get the value as:
var nValue = txtDynamic.Value;
而且我们知道动态添加的控件将在postback
事件中丢失,然后我们可以创建一个方法,该方法将使用controls
存储在中的控件并使用Session
它们的值重新渲染它们:
private void _renderControls()
{
try
{
if (Session.Count > 0)
{
for (int k = 0; k < Session.Count; k++)
{
if (Session[k] != null)
{
var _ctrl = new HtmlInputText("Integer") //you can make it dynamic to add different types of input control
{
Name = ((HtmlInputText)Session[k]).ID,
ID = ((HtmlInputText)Session[k]).ID,
Value = ((HtmlInputText)Session[k]).Value
};
if (_ctrl != null)
{
_ctrl.Attributes.Add("runat", "server");
var row = new System.Web.UI.HtmlControls.HtmlTableRow();
var newCell = new HtmlTableCell();
newCell.Controls.Add(_ctrl);
row.Cells.Add(newCell);
my_Table.Rows.Add(row);
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
现在,让我们修改Page_load()
事件以在每个事件上调用此方法postback
:
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
_renderDynamic(); // this method will be called if there is an postback event to re-render the dynamic controls
}
}
笔记:
- 这只是一个示例(那里可能有很多更好的方法)。
- 我已经使用
HtmlInputText
with 属性Integer
来创建一个input[type="number"]
.
推荐阅读
- node.js - nodejs收到错误TypeError:无法读取未定义的属性'then'
- python - lxml + django + uwsgi 无法生成正确格式的excel文件?
- html - 使 InputBox 中的部分文本在 Angular 7 中不可编辑
- node.js - Mongoose 错误:发布评论时出现 CastError
- javascript - 防止从 TinyMCE 内部触发拖动事件
- r - 部分匹配字符串以删除 R 中的 df 列
- javascript - 在我的 COMPARE WEATHER 网站页面中,当用户单击比较按钮时,ejs 模板中仅呈现一个城市信息?
- pandas - 无法将字符串转换为浮点数:'05-01-17'
- javascript - 拦截器从请求中删除标头
- sql - 如何优化 SQL 中的 case 表达式