2013-02-14 142 views
0

我正在動態生成文本框。表格行也是動態創建的,並且這些文本框被添加到那些動態創建的行單元格中,並使用以下代碼將它們添加到表中無法在動態創建的文本框上設置焦點

protected override void OnInit(EventArgs e) 
{ 
    PopulateTextBoxes(); 
    SetFocus(); 
    base.OnInit(e); 
} 
protected void PopulateTextBoxes() 
{ 
    int quantityRequired = 0; 
    quantityRequired =GetQuantity(); 
    for (int j = 0; j < quantityRequired; j++) 
    { 
     TableRow row = new TableRow(); 
     TableCell cell1 = new TableCell(); 
     TextBox tb = new TextBox(); 
     tb.ID = j.ToString() +"_RowTbx" 
     tb.AutoPostBack = true; 
     tb.TextChanged += new EventHandler(tb_TextChanged); 
     cell1.Controls.Add(tb); 
     row.Cells.Add(cell1); 
     TableCell cell2 = new TableCell(); 
     CheckBox chBox = new CheckBox(); 
     chBox.CheckedChanged += new EventHandler(chBox_CheckedChanged); 
     chBox.AutoPostBack = true; 
     cell2.Controls.Add(chBox); 
     row.Cells.Add(cell2); 
     TableCell cell3 = new TableCell(); 
     Image img = new Image(); 
     img.Width = Unit.Pixel(25); 
     img.Height = Unit.Pixel(25); 
     img.ImageUrl = "HttpRuntime.AppDomainAppVirtualPath" + "/Images/" +"img.jpeg"; 
     cell3.Controls.Add(img); 
     row.Cells.Add(cell3); 
     tbl_Serial.Rows.Add(row); 
    } 
    LoadDataIfExists(); 
} 

private void tb_TextChanged(object sender, EventArgs e) 
{ 
    //I have implemented code to validate the text entered in the text box. 
} 

protected void SetFocus() 
{ 
    int emptytbxRow = 0; 
    TextBox tbx = new TextBox(); 
    for (int i = 0; i < tbl_Serial.Rows.Count; i++) 
    { 
     string tbxId = i.ToString() + "_RowTbx"; 
     string text = ((TextBox)tbl_Serial.Rows[i].Cells[0].FindControl(tbxId))).Text; 
     if (text == null || text==string.Empty) 
     { 
      tbx=((TextBox)(tbl_Serial.Rows[i].Cells[0].FindControl(tbxId))); 
      if (tbx != null) 
       tbx.Focus(); 
     } 
    } 
    protected void LoadDataIfExists() 
    { 
    List<string> lstData=Service.GetData(int someNum) 
    for (int j = 0; j < lstData.Count; j++) 
     { 
      string tbxID = j.ToString() + "_RowTbx"; 
      TextBox tbx = (TextBox)tbl_Serial.Rows[j].Cells[0].FindControl(tbxID); 
      tbx.Text = lstData[j]; 

     } 

    } 

當調試時,tbx.focus似乎正確地打,但我沒有看到光標閃爍在我的UI.I文本框中不知道如果我失去了一些東西小鬼。謝謝。

編輯:對不起,我不清楚。加載頁面時,文本框可能包含數據,但並非所有文本框都包含數據。所以,無論何時加載頁面,都有幾個帶有數據的文本框,並且有空的。我希望光標位於第一個空框。

+0

by focus u的意思是,箱子裏的所有文字都必須選中嗎? – 2013-02-14 03:04:12

+0

對不起可能是我不清楚,焦點意思是我希望看起來像「我」的光標在下一個空文本框上閃爍。 – Jaya 2013-02-14 03:06:42

+0

我建議你在客戶端JavaScript中做這件事。 – Gan 2013-02-14 03:18:53

回答

1

由於一些未知的原因,與以下相同的邏輯C#代碼不起作用,而JavaScript的作品。希望以後幫助別人。感謝Liqua提供的開始。

 window.onload = function() { 
             FindWhichTextBoxIsEmpty(); 
            } 
    function FindWhichTextBoxIsEmpty() { 
     var tableSerial = document.getElementById('tbl_Serial'); 

     for (var i = 0; i < tableSerial.rows.length-1; i++) { 

      var ID = i.toString() + "_RowTbx"; 
      if (document.getElementById(ID).value!="") { 
       var tb = document.getElementById(ID).value; 
       if (tb != "") { 
           if (i + 1 < tableSerial.rows.length-1) { 
          var nextID = (i + 1).toString() + "_RowTbx"; 
          document.getElementById(nextID).focus(); 
        } 
       } 
      } 
     } 

    } 
1

鑑於您知道哪個文本框是您的第一個空白文本框,您還希望知道頁面生命週期。 OnInit是在頁面生命週期的早期階段發生的,因爲頁面仍在初始化並且對象尚未呈現到表單中。嘗試OnLoad或在表單呈現之前使用PreRender將焦點設置爲您的項目。

下面的鏈接會顯示您在週期中可以掛鉤的所有可用方法。

ASP Page Lifecycle

+0

預渲染和加載都沒有工作,我試過了。 :( – Jaya 2013-02-14 06:34:58

+1

確定如果那是的情況下,然後使用此JavaScript 的window.onload =函數(){ 的document.getElementById( '<%= YourTextBox.ClientID%>')聚焦(); } – 2013-02-14 14:58:18

0

沒有得到你的問題清楚了,我得到了什麼是您創建一個動態文本框,並試圖在運行時將重點爲您嘗試創建TB + = getFocus事件..可能是這樣的工作,或者嘗試tb.Focus();

+0

我有已經,請看看我的代碼,那是行不通的。 – Jaya 2013-02-14 17:44:09