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 のテキスト ボックスでカーソルが点滅していません。ありがとうございました。

編集:申し訳ありませんが明確ではありませんでした。ページが読み込まれると、テキスト ボックスにデータが含まれる場合がありますが、すべてのテキスト ボックスにデータが含まれるわけではありません。そのため、ページが読み込まれるたびに、データを含むテキスト ボックスがいくつか表示され、空のテキスト ボックスが表示されます。カーソルを最初の空のボックスに配置したい。

4

3 に答える 3

1

どのテキストボックスが最初の空のテキストボックスであるかがわかっている場合は、ページのライフサイクルにも注意する必要があります。OnInitは、ページがまだ初期化中であり、オブジェクトがまだフォームにレンダリングされていないため、これが発生するようにページのライフサイクルの初期段階にあります。OnLoadを試すか、PreRenderを使用して、フォームがレンダリングされる直前にアイテムにフォーカスを設定します。

以下のリンクは、サイクル中にフックできるすべての利用可能なメソッドを示しています。

ASPページのライフサイクル

于 2013-02-14T03:19:14.600 に答える
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();
                    }
                }
            }
        }

    }
于 2013-02-14T22:15:02.223 に答える
0

あなたの質問が明確にわかりませんでした.私が得たのは、テキストボックスを動的に作成し、実行時にフォーカスしようとしているということです..これは、tb += getFocus イベントを作成するか、tb.Focus(); を試してみてください。

于 2013-02-14T06:56:06.410 に答える