4

問題

<asp:TextBox>は更新されていません。

背景

というページがありますAdd_Edit_Drugs.aspx。このページには、次の2つの方法のいずれかでアクセスできます。ユーザーがAdd Drugボタンをクリックすると、Response.Redirect("Add_Edit_Drugs.aspx")コマンドが実行されます。または、ハイパーリンクをクリックすると、次のように同じページに移動します。

<asp:HyperLinkField
            DataNavigateUrlFields="Drug_INDEX"
            DataNavigateUrlFormatString="Add_Edit_Drugs.aspx?Drug_INDEX={0}"
            DataTextField="Drug_Name"
            HeaderText="Drug Name"
            />

イベントはクエリ文字列のPage_Load存在をチェックし、存在する場合はデータベース内の情報をフィールドに入力します。存在しない場合は、空白のままにします。

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString["Drug_INDEX"] != null)
    {
        String sIndex = Request.QueryString["Drug_INDEX"].ToString();

        if (!Int32.TryParse(sIndex, out Drug_INDEX)) //Query String not a valid index
        {
            errorMessage.Text = "There was an error retrieving the record.";
            message.Text = "Please contact you IT administrator.";
        }
        else
        {

            Drug_IO dio = new Drug_IO();
            SqlDataReader drugDataReader = dio.Get_Drug(Drug_INDEX);
            if (drugDataReader.Read())
            {
                drugNameTxt.Text = drugDataReader["Drug_Name"].ToString();
                descriptionTxt.Text = drugDataReader["DrugDescription"].ToString();
                toxTxt.Text = drugDataReader["Toxicity"].ToString();
                hlTxt.Text = drugDataReader["HalfLife"].ToString();
                hlUnitsTxt.Text = drugDataReader["HalfLife_Units"].ToString();
                bindingTxt.Text = drugDataReader["ProteinBinding"].ToString();
                logPTxt.Text = drugDataReader["LogP"].ToString();
                molecularWeightTxt.Text = drugDataReader["MolecularWeight"].ToString();
                molecularFormTxt.Text = drugDataReader["MolecularFormula"].ToString();
                chemicalForumlaTxt.Text = drugDataReader["ChemicalFormula"].ToString();
            }
        }
    }
}

それから私は私のsaveBtn_Click方法を持っています:

protected void saveBtn_Click(object sender, EventArgs e)
{
    double halfLife;
    if (!Double.TryParse(hlTxt.Text, out halfLife))
        halfLife = Double.NaN;

    double logP;
    if (!Double.TryParse(logPTxt.Text, out logP))
        logP = Double.NaN;

    double moleWeight;
    if (!Double.TryParse(molecularWeightTxt.Text, out moleWeight))
        moleWeight = Double.NaN;

    if (-1 == Drug_INDEX) // New record to be inserted
    {
        Drug_Record dr = new Drug_Record(
            drugNameTxt.Text,
            descriptionTxt.Text,
            toxTxt.Text,
            halfLife,
            hlUnitsTxt.Text,
            bindingTxt.Text,
            logP,
            moleWeight,
            molecularFormTxt.Text,
            chemicalForumlaTxt.Text);

        if (dr.saveToDataBase())
        {
            Response.Redirect("List_Drugs.aspx");
        }
        else
        {
            message.Text = "An error occured saving the record.";
            errorMessage.Text = "Please contact your system admin.";
        }
    }
    else //record already exists in db, needs to be updated
    {
        Drug_Record dr = new Drug_Record(
            drugNameTxt.Text,
            descriptionTxt.Text,
            toxTxt.Text,
            halfLife,
            hlUnitsTxt.Text,
            bindingTxt.Text,
            logP,
            moleWeight,
            molecularFormTxt.Text,
            chemicalForumlaTxt.Text,
            Drug_INDEX);

        if (dr.updateRecord())
        {
            Response.Redirect("List_Drugs.aspx");
        }
        else
        {
            message.Text = "An error occur updating the record.";
            errorMessage.Text = "Please contact your system admin.";
        }
    }
}

さて、ご想像のとおり、私のelse //record already existsブロックでは、ユーザー編集から(おそらく)新しい値を取得すると、実際に取得するのは、データベースから取得した元の情報です。私が読んだことから、問題はかどうかの問題にあることがわかりますPage.IsPostBack。チェックインしましたPage_Load。チェックインしましたsaveBtn_Click。新しいレコードを作成する前にチェックし、レコードを更新する前にチェックしました。私はそれらすべてを組み合わせました。私はそれらを反転させました。私が何を試しても、次の2つのいずれかが発生します。

  1. 古い情報を入手します。
  2. 何もない。

この特定の問題は、実際にはより大きな問題の症状です。私は(ちょっと)aが何であるかPostBack は理解していますが、何が原因であるかは実際には理解していません。この場合、PostBackの原因は何ですか?いつ確認する必要がありますか?

4

3 に答える 3

4

ページの読み込みでは、ポストバックであるかどうかを確認するPage.IsPostBack必要があります。ポストバックでない場合は、ページの最初の読み込みを行う必要があります。ポストバックの場合は、ページ上のコントロールの1つが、ボタンのクリックなどのサーバー側のイベントを開始しました。

ボタンをクリックすると、ラベルまたはテキストボックスを更新できます。ページの読み込みはポストバックごとに呼び出されるため、初期化コードを2回実行しないように注意してください。

最初の読み込みでのみ実行する場合は、ページの読み込みですべてのポストバックの初期化が実行されているようです。この変更を試してください:

protected void Page_Load(object sender, EventArgs e)
{

    if (!Page.IsPostBack) {

        if (Request.QueryString["Drug_INDEX"] != null)
        {
            String sIndex = Request.QueryString["Drug_INDEX"].ToString();

            if (!Int32.TryParse(sIndex, out Drug_INDEX)) //Query String not a valid index
            {
                errorMessage.Text = "There was an error retrieving the record.";
                message.Text = "Please contact you IT administrator.";
            }
            else
            {

                Drug_IO dio = new Drug_IO();
                SqlDataReader drugDataReader = dio.Get_Drug(Drug_INDEX);
                if (drugDataReader.Read())
                {
                    drugNameTxt.Text = drugDataReader["Drug_Name"].ToString();
                    descriptionTxt.Text = drugDataReader["DrugDescription"].ToString();
                    toxTxt.Text = drugDataReader["Toxicity"].ToString();
                    hlTxt.Text = drugDataReader["HalfLife"].ToString();
                    hlUnitsTxt.Text = drugDataReader["HalfLife_Units"].ToString();
                    bindingTxt.Text = drugDataReader["ProteinBinding"].ToString();
                    logPTxt.Text = drugDataReader["LogP"].ToString();
                    molecularWeightTxt.Text = drugDataReader["MolecularWeight"].ToString();
                    molecularFormTxt.Text = drugDataReader["MolecularFormula"].ToString();
                    chemicalForumlaTxt.Text = drugDataReader["ChemicalFormula"].ToString();
                }
            }
        }
    }
}

PostBackが発生すると、初期化コードは実行されず、ボタンクリックイベントに進み、テキストボックスの値を更新できます。ボタンイベントはポストバックによってのみトリガーできるため、PageLoadは、この状況でポストバックであるかどうかを確認する必要がある唯一の場所です。

于 2012-08-02T15:17:20.187 に答える
1

フォームを最初に初期化する前に、ページの読み込みがポストバックであるかどうかを確認してください。

if (!Page.IsPostBack && Request.QueryString["Drug_INDEX"] != null)

また、asp.netページのライフサイクルがどのように機能するかを確認することをお勧めします。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

于 2012-08-02T15:14:39.890 に答える
1

はい、まさにPostBackの問題があります。初めてデータをロードするときは、!に配置する必要があります。IsPostback。

if(!IsPostback)
{
   //First Load
   //Initialize Data
    if (Request.QueryString["Drug_INDEX"] != null)
    {
       ........

    }
}

ボタンをクリックすると、データが投稿されます=>(IsPostBack == true)=>(!IsPostBack == false)=>彼は初期化のこのフェーズを通過しません

于 2012-08-02T15:16:14.647 に答える