无法在动态创建的文本框上设置焦点

问题描述:

我正在动态生成文本框。表格行也是动态创建的,并且这些文本框被添加到那些动态创建的行单元格中,并使用以下代码将它们添加到表中无法在动态创建的文本框上设置焦点

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

由于一些未知的原因,与以下相同的逻辑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(); 
        } 
       } 
      } 
     } 

    } 

鉴于您知道哪个文本框是您的第一个空白文本框,您还希望知道页面生命周期。 OnInit是在页面生命周期的早期阶段发生的,因为页面仍在初始化并且对象尚未呈现到表单中。尝试OnLoad或在表单呈现之前使用PreRender将焦点设置为您的项目。

下面的链接会显示您在周期中可以挂钩的所有可用方法。

ASP Page Lifecycle

+0

预渲染和加载都没有工作,我试过了。 :( – Jaya 2013-02-14 06:34:58

+1

确定如果那是的情况下,然后使用此JavaScript 的window.onload =函数(){ 的document.getElementById( '')聚焦(); } – 2013-02-14 14:58:18

没有得到你的问题清楚了,我得到了什么是您创建一个动态文本框,并试图在运行时将重点为您尝试创建TB + = getFocus事件..可能是这样的工作,或者尝试tb.Focus();

+0

我有已经,请看看我的代码,那是行不通的。 – Jaya 2013-02-14 17:44:09