Как присвоить значение элементу управления текстового поля внутри столбца таблицы в файле кодирования C #? - PullRequest
0 голосов
/ 14 июня 2019

Я создаю веб-форму 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, у него есть текстовое поле, но я не знаю, как получить доступ к текущему значению и назначить новоеценность .. может кто-нибудь помочь мне, как добиться этого ..

1 Ответ

0 голосов
/ 17 июня 2019

При работе с 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"].
...