首页 > 解决方案 > 如何为 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,它有文本框,但我不知道如何访问当前值并分配新值.. 谁能帮我实现这个..

标签: c#asp.netc#-4.0html-tablewebforms

解决方案


使用动态控件时必须记住的一件事是,每当postback发生 a 时,您都会丢失动态创建的控件(因为回发调用Page_load()事件,因此如果在加载事件中没有它们,它们将不会生成因此不会显示。)。因此,最好在加载事件中重新渲染控件。

因此,为了获得动态分配的控件(HTMLAsp.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
    }
}

笔记:

  • 这只是一个示例(那里可能有很多更好的方法)。
  • 我已经使用HtmlInputTextwith 属性Integer来创建一个input[type="number"].

推荐阅读