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 page只能有一个服务器端 Form 标签。” 我必须将表单保留在 Site.Master 上,但我无法将生成表的代码隐藏移动到 Site.Master.cs

4

2 回答 2

0

页面控件(在您的情况下为 this 或 this.Page)具有对 Master 本身的引用,因此您必须遍历控件集合以找到 Master 的子控件 - 其中一个将是表单。它不能保证是唯一的,它显然是 M*N 数量级的东西,但它在很长一段时间内对我有用。

你会像这样使用它:

控制 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 回答