0

Default.aspx.cs コード ビハインド内で、DataTable _dt に、タブ区切りのテキスト ファイルから読み取ったデータを入力しました。ユーザーが Default.aspx のボタンをクリックしたときに、_dt のすべての内容をユーザーに表示したいと考えています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.Net;
using System.Text;
using System.Data;
using System.IO;

...

        String strLine = String.Empty;
        Int32 iLineCount = 0;
        System.IO.StreamReader srdr = new System.IO.StreamReader(filePath);
        do
        {
            strLine = srdr.ReadLine();
            if (strLine == null)
            { break; }
            if (0 == iLineCount++)
            {
                _dt = this.CreateDataTableForTabbedData(strLine);
            }
            this.AddDataRowToTable(strLine, _dt);
        }
        while (true);
        form1.Controls.Add(_dt);

しかし、VSは私にエラーを与えています:「名前form1は現在のコンテキストに存在しません」. form1 は Default.aspx 内には存在しませんが、Site.Master 内には存在します。

コード ビハインドを機能させるには、おそらく Default.aspx 内に form1 が存在する必要があることを認識していますが、それを実行しようとして、Site.master の ID を form2 に変更すると、「A ページ」というエラーが表示されます。サーバー側の Form タグを 1 つだけ持つことができます。」フォームを Site.Master に保持する必要がありますが、テーブルを生成するコード ビハインドを Site.Master.cs に移動することはできません。

4

2 に答える 2

0

ページ コントロール (この場合は this または this.Page) にはマスター自体への参照があるため、マスターの子コントロールを見つけるためにコントロール コレクションをトラバースする必要があります。そのうちの 1 つはフォームになります。一意であるとは限りませんし、明らかに M*N 程度ですが、私にとっては長い間うまくいきました。

次のように使用します。

Control oCtl = SomeUtilityClass.FindControlRecursive(this.Page, "form1"); (ここでnullをチェックすることを忘れないでください;-)

そのようなものを処理するためにこれを書きました:

/// <summary>
        /// Recursive loop to find a control
        /// </summary>
        /// <param name="rootCtl">Control whose control collection we will begin traversing in search of the 
        ///     given ID</param>
        /// <param name="Id">ID to search for</param>
        /// <returns></returns>
        public static Control FindControlRecursive(Control rootCtl, string desiredCtlID)
        {
            //Make sure this thing exists
            if (rootCtl == null)
                return null;

            //See if it's the one we're after
            if (rootCtl.ID == desiredCtlID)
                return rootCtl;

            //Make sure it has controls to loop over
            if (!rootCtl.HasControls())
                return null;

            foreach (Control oCtl in rootCtl.Controls)
            {
                Control FoundCtl = FindControlRecursive(oCtl, desiredCtlID);
                if (FoundCtl != null)
                    return FoundCtl;
            }

            return null;
        }
于 2012-10-23T00:15:53.307 に答える
0

OleDbDataAdapter のこのチュートリアルを使用して、データを表示することができました。

        DataSet dataset = Read_File_Into_Dataset("C:\\TEMP\\", "input.txt");
        DataGrid dg = new DataGrid();
        dg.DataSource = dataset;
        dg.DataBind();
        this.Controls.Add(dg);

        public DataSet Read_File_Into_Dataset(string fullpath, string file)
        {
        string sql = "SELECT * FROM `" + file + "`"; // Read all the data
        OleDbConnection connection = new OleDbConnection // Connection
          ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fullpath + ";"
           + "Extended Properties=\"text;HDR=YES;FMT=Delimited\"");
        OleDbDataAdapter ole = new OleDbDataAdapter(sql, connection); // Load the data into the adapter
        DataSet dataset = new DataSet(); // To hold the data
        ole.Fill(dataset); // Fill the dataset with the data from the adapter
        connection.Close(); // Close the connection
        connection.Dispose(); // Dispose of the connection
        ole.Dispose(); // Get rid of the adapter
        return dataset;
        }
于 2012-10-23T18:07:41.750 に答える