При работе с Dynamic Controls следует помнить одну вещь: всякий раз, когда происходит postback
, вы теряете динамически созданные элементы управления (, так как обратный вызов вызывает 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
со свойством Integer
для создания input[type="number"]
.