0

ディレクトリを検索してすべてのユーザーコントロールをフォームにロードし、「GetResult()」メソッドを使用してフォームから回答を取得するアプリケーションを作成しました。私はまだOOPを十分に活用する方法を学んでいるので、このOOPスタイルを実行しませんでした。今度は、オブジェクトを操作している場合にはるかに簡単になる次の部分に進むことができるように、OOPを使用して設計することに戻ります。今、「RequestForm」クラスを作成しました。RequestForm.ResultをUCに到達させ、GetResults()メソッドを呼び出したいと思います。知識が不足しているため、誰かが私を正しい方向に向けることができるかもしれませんが、私はこれを行うのに苦労しています。

FormUserControl-抽象クラス

namespace AccessRequest
{
    public abstract class FormUserControl : UserControl
    {
        public abstract string Name();
        public abstract string GetResults();
        public abstract string EmailUsers();
    }
}

RequestForm-オブジェクトクラス

namespace AccessRequest
{
public class RequestForm
{
    public string Name { get; set; }
    public string ControlID { get; set; }
    public string StepName { get; set; }
    public string FilePath { get; set; }
    public string Results { 
        get
        {
            //How would I pull my usercontrol results with Control.GetReults() from within this area?
            //I have since then turned this into a method. How would I get it to access my UserControl loaded on the asp page to grab the results?
        }
        set;
    }
    public string Emails { get; set; }
    public int Position { get; set; }
    public bool Visible { get; set; }

    public RequestForm()
    {

    }
    /// <summary>
    /// FormResults gathers all needed information about the forms
    /// </summary>
    /// <param name="formName">Name of the Form</param>
    /// <param name="formControlID">ID of the User Control </param>
    /// <param name="wizardStepID">ID of the Wizard Step</param>
    /// <param name="formFilePath">File path of the physical form</param>
    /// <param name="formResults">Results from the form</param>
    /// <param name="formEmails">Other emails to include</param>
    public RequestForm(string formName, string formControlId, string wizardStepID, int wizardStepPosition, string formFilePath, string formResults, string formEmails)
    {
        this.Name = formName;
        this.ControlID = formControlId;
        this.StepName = wizardStepID;
        this.Position = wizardStepPosition;
        this.FilePath = formFilePath;
        this.Results = formResults;
        this.Emails = formEmails;
        this.Visible = false;
    }

    public void SaveList(List<RequestForm> formList)
    {
      //  HttpContext.Current.Session["FormList"] = formList;
    }
}

}

これが、すべてのフォームをロードするためにOnInitに配置したLoadForms()メソッドです。RequestFormピースを完全に実装していませんが、これは、オブジェクトリストの作成に使用する必要があると考えています。

private void LoadForms()
    {
        string dotColor = "Black";
        string formColor = "#808080";

        int loc = 3;
        foreach (ListItem item in chklApplications.Items)
        {
            string formPath = (string)item.Value;

            WizardStepBase newStep = new WizardStep();
            newStep.ID = "wzStep" + item.Text;
            newStep.Title = String.Format("<font color='{0}'>  ¤</font> <font color='{1}'>{2} Request</font>", dotColor, formColor, item.Text);


            var form = LoadControl(formPath);
            form.ID = "uc" + item.Text;
            newStep.Controls.Add(form);
            wzAccessRequest.WizardSteps.AddAt(loc, newStep);

            requestForm.Add(new RequestForm(
                                            item.Text,                      //Form name
                                            form.ID.ToString(),             //User Control ID
                                            newStep.ID.ToString(),          //Wizardstep ID
                                            loc,                            //Wizardstep Position
                                            item.Value.ToString(),          //File Path    
                                            null,                           //Form Results
                                            null                            //Form Emails
                                            ));
            loc++;
        }

    }

ここで、ウィザードコントロールのサイドメニューに表示するかどうかを設定します。ところで、誰かがこれのためのテーブルタグを作成することさえ防ぐことができる方法を知っていますか?現在、フォームを挿入するスペースが大きくなっています。

protected void SideBarList_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            if (!ShowWizardStep(e.Item.DataItem))
            {
                e.Item.CssClass = "Hidden";

            }

        }
    }

アドバイスありがとうございます!! :D

4

2 に答える 2

1

わかりました、それで私はこれを理解しました。フォームからすべての結果を収集し、確認画面に吐き出す方法はすでにありました。そのコードを操作して、作業中のオブジェクトに直接ロードするようにしました。これで、オブジェクトはコントロールに必要なすべての動的情報でいっぱいになり、それらをはるかに簡単に管理できるようになりました。他の誰かが答えを探している場合のコードは次のとおりです。

私のクラス

public class RequestForm
{
    public string Name { get; set; }
    public string ControlID { get; set; }
    public string StepID { get; set; }
    public string FilePath { get; set; }
    public string Emails { get; set; }
    public string Results { get; set; }
    public int Position { get; set; }
    public bool Visible { get; set; }

    /// <summary>
    /// FormResults gathers all needed information about the forms
    /// </summary>
    /// <param name="formName">Name of the Form</param>
    /// <param name="formControlID">ID of the User Control </param>
    /// <param name="wizardStepID">ID of the Wizard Step</param>
    /// <param name="formFilePath">File path of the physical form</param>
    /// <param name="formResults">Results from the form</param>
    /// <param name="formEmails">Other emails to include</param>
    public RequestForm(string formName, string formControlId, string wizardStepID, int wizardStepPosition, string formFilePath, string formEmails,string formResults, bool formVisible = false)
    {
        this.Name = formName;
        this.ControlID = formControlId;
        this.StepID = wizardStepID;
        this.Position = wizardStepPosition;
        this.FilePath = formFilePath;
        this.Emails = formEmails;
        this.Results = formResults;
        this.Visible = formVisible;
    }
}

すべてのコントロールを保持するこのリスト

    public List<RequestForm> requestForm
    {
        get
        {
            List<RequestForm> requestList = new List<RequestForm>();
            requestList = (List<RequestForm>)Session["RequestForms"];
            var v = Session["RequestForms"];
            return v != null ? (List<RequestForm>)v : null;
        }
        set
        {
            Session["RequestForms"] = value;
        }
    }

これは、結果を収集してオブジェクトに入れるために使用する方法です。

    private void GatherFormsData()
    {
        if (requestForm != null)
        {
            foreach (RequestForm rform in requestForm)
            {
                if (rform.Visible)
                {
                    WizardStepBase step = (WizardStep)wzAccessRequest.FindControl(rform.StepID);
                    FormUserControl form = (FormUserControl)step.FindControl(rform.ControlID);
                    rform.Results = String.Format("{0}<br>Email: {1}<br><br>", form.GetResults(), form.EmailContact());
                }
            }
        }
    }

これが誰かを助けることを願っています。

于 2010-10-21T12:58:40.027 に答える
0

あなたが取り組む必要のあるいくつかの問題があります—あなたのコードとあなたの現在の知識の両方で:-)これから始めてください:

  1. OnInitASP.NETのページのライフサイクルに関するいくつかの記事を読んで、各ライフサイクルイベントハンドラー( 、、、OnLoad…)で何をするかを理解してください。良い出発点は、このMSDNの概要かもしれません。ただし、「ASP.NETページのライフサイクル」をグーグルで検索し、他のいくつかの記事や例も読んでください。

    また、ASP.NETページ処理の要求と応答の性質を理解する必要があります。最初に、ユーザーが[送信]ボタンを押してHTTP POSTリクエストが発生した場合、ページの構造やIDなどに一致するようにページのコントロールツリーを作成する必要があることに注意してください。前のリクエスト。それ以外の場合、ASP.NETは、ユーザーが入力したデータをバインドするためのコントロールを認識しません。

  2. タグ付けされた行の近くで//Lost and confused here :/、新しいコントロールを作成し、すぐに「結果」(その中のいくつかの編集ボックスの値であると予想されます)をクエリしています。Pageフォームがリクエスト処理を駆動するオブジェクトからデータを受信するのはおそらく時期尚早であるため、これは機能しません。

  3. あなたのResults財産はうまく設計されていません。まず、通知なしに変更できるような方法でデータを実際に「生成」するプロパティを使用しないでください。プロパティは「スマートフィールド」として使用されます。そうしないと、管理しにくく、読みにくいコードになってしまいます。第二に、あなたがそこに残したセッターは「セット」のようです。プロパティに割り当てられた値は、取得する方法がないため、実際には失われます。まれに、この動作が意図的なものである場合もありますが、あなたの場合は単なるエラーだと思います。

したがって、現在、問題に取り組むための「優れたOOP方法」を残すことはできますが、ページのライフサイクルについてはもっとよく理解する必要があります。それを理解するには、ASP.NET Webアプリケーションがどのように機能するかについての原則について考える必要がありますが、実際に必要なキックフォワードを提供すると確信しています。

更新: Tonyのコード(コメントを参照)に関しては、コードを前進させるために次のことを行う必要があります。

  1. プロパティ内のフォームデータのリストにはrequestForm、[フォームASCXパス、コントロールID、実際のRequestFormデータクラス]のタプルが含まれている必要があります。

  2. GatherFormsif (Page.IsPostBack)ページが最初にロードされたとき(つまり)にのみ呼び出されrequestForm、使用可能なASCXフォームのそれぞれのタプルで埋められます。

  3. ウィザードのステップとウィザードの両方のステップは、の内容に基づいてchklApplications作成する必要があります。LoadFormsrequestForm

  4. 結果を収集する場合は、それぞれのrequestFormエントリに保存されているIDを使用して、実際のユーザーコントロールを検索できます。

于 2010-10-07T15:27:03.633 に答える