2014-09-02 1 views
1

В моей разметке (Default.aspx), у меня есть простая таблица:ASP.NET CheckBoxes Включение/выключение Textbox в код

<asp:Table id="myAspTable" runat="server" /> 

I мой код позади (Default.aspx.cs), я есть целое число (п), который может быть что угодно, от 1 до 100:

int n = getValueOfN(); 

Исходя из этого числа, я могу создать флажки и текстовые поля динамически и добавить их к моей странице:

CheckBox[] checks = new CheckBox[n]; 
TextBox[] texts = new TextBox[n]; 

for (int i=0; i<n; i++) 
{ 
    checks[i] = new CheckBox(); 
    texts[i] = new TextBox(); 

    tblrow = new TableRow(); 
    tblcell = new TableCell(); 
    tblcell.Controls.Add(checks[i]); 
    tblcell.Controls.Add(texts[i]); 
    tblrow.Controls.Add(tblcell); 
    myAspTable.Controls.Add(tblrow); 
} 

Теперь я хочу добавить следующие функциональные возможности: каждый флажок i должен включать или отключать текстовое поле i, если оно отмечено или отменено соответственно. Как мне сделать это на 100% в коде?

Вот что я пробовал:

checks[i].AutoPostBack = true; 
checks[i].CheckedChanged += new EventHandler(this.CheckToggleEnable); 


public void CheckToggleEnable(object sender, EventArgs e) 
{ 
    // Implementation here 
} 

Но это не работает, потому что у меня нет никакого способа ссылки Textbox я в функции CheckToggleEnable. Кроме того, я надеялся сделать это без обратной связи.

+0

Пожалуйста, не просто попросите нас решить проблему за вас. Покажите нам, как _you_ попытался решить проблему самостоятельно, а затем покажите нам _exactly_, каким был результат, и скажите, почему вы считаете, что это не сработало. См. «[Что вы пробовали?] (Http://whathaveyoutried.com/)» за отличную статью, которую вы действительно должны прочитать. –

ответ

2

В ASP.Net, если вы создаете элемент управления динамически, вам нужно его воссоздать, когда он будет отправлен обратно на сервер.

В принципе, n не должно быть динамическим в вашем коде. В противном случае мы не знаем, сколько элементов управления нам нужно воссоздать в обратной передаче.

Следующий код будет получать родственный TextBox раз в CheckBox проверяется.

<asp:Table ID="myAspTable" runat="server" /> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    int n = 3; 

    for (int i = 0; i < n; i++) 
    { 
     var checkBox = new CheckBox(); 
     var textBox = new TextBox(); 

     var tblrow = new TableRow(); 
     var tblcell = new TableCell(); 
     tblcell.Controls.Add(checkBox); 
     tblcell.Controls.Add(textBox); 
     tblrow.Controls.Add(tblcell); 
     myAspTable.Controls.Add(tblrow); 

     checkBox.AutoPostBack = true; 
     checkBox.CheckedChanged += CheckBox_CheckedChanged; 
    } 
} 

protected void CheckBox_CheckedChanged(object sender, EventArgs e) 
{ 
    var checkbox = sender as CheckBox; 

    var textbox = checkbox.Parent.Controls.OfType<TextBox>() 
     .Select(control => control) 
     .FirstOrDefault(); 

    if (textbox != null) 
    { 
     string value = textbox.Text; 
    } 
} 
1

На каждом наборе CheckBox:

AutoPostBack="True" 

Какие сообщения обратно на сервер каждый раз один щелкают. Вы можете прикрепить к событию CheckChanged, а затем найти правильное текстовое поле и набор:

Enabled="True" 
Enabled="False" 

В зависимости от состояния.

Я бы посоветовал, если у вас много проверок, чтобы сделать это на клиентском JavaScript из-за возможности повторного отправки на сервер повторно ... это может быть интенсивным на сервере.