0

グリッドビュー内にドロップダウンリストとテキストボックスを動的に作成しています。テキストボックスは現在無効になっています。これら両方のコントロールの ID は、SQL テーブルから取得されます (したがって、SQL から受け取った値が変更される可能性があるため、それらは本質的に動的でもあります)。

新しく生成されたドロップダウンリストで「その他」が選択されている場合にのみ、テキストボックスを有効にしたい。以下は、私が生成しているドロップダウンリストのコードです:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false;
    e.Row.Cells[1].Width = 400;
    e.Row.Cells[2].Visible = false;
    e.Row.Cells[3].Visible = false;
    e.Row.Cells[4].Visible = false;
    e.Row.Cells[5].Width = 300;
    e.Row.Cells[6].Visible = false;
    e.Row.Cells[7].Visible = false;
    e.Row.Cells[8].Visible = false;
    e.Row.Cells[9].Width = 300;
    string anstype = e.Row.Cells[2].Text;
    string ansname = e.Row.Cells[3].Text;
    string othertype = e.Row.Cells[6].Text;
    string othername = e.Row.Cells[7].Text;

    if (anstype == "DropDownList")
    {
        DropDownList ddl = new DropDownList();
        ddl.ID = ansname;
        ddl.AutoPostBack = true;
        ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
        ddl.Width = 300;
        e.Row.Cells[5].Controls.Add(ddl);
    }

    if (othertype == "Free Text")
    {
        TextBox txt = new TextBox();
        txt.ID = othername;
        txt.Width = 300;
        txt.Enabled = false;
        e.Row.Cells[9].Controls.Add(txt);
    }

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ddlName = new DropDownList();
    ddlName = (DropDownList)sender;
    string val = ddlName.SelectedItem.Text.ToString();
    if (val == "Other")
    {
        //ENABLE THE TEXT BOX
    }
}

私が考えることができる最も簡単な方法は、テキスト ボックスの名前 (othename 変数) をイベント ハンドラーに渡すことです。C#初心者ですが、やり方がわかりません。助けてください..!!!

!!..編集..!!

テキストを参照する方法を見つけましたが、今直面している別の問題があります。「AutoPostBack」により、GridView 全体が更新され、ドロップダウンリストのイベントもトリガーされません。助言がありますか?

4

1 に答える 1

1

これまでに寄せられたコメントから、要約すると、データベースからロードされる調査に関する一連の質問があります。コントロールから回答を選択してもらい、これらの質問に対してサーバー側で生成します。ここまでは簡単ですが、回答のドロップダウンから [その他] を選択したときにテキスト ボックスを表示し、そのボックスで残りの回答を取得することが複雑になります。これをサーバー側で行おうとすると、通常、コントロールはグリッドビューの列定義の一部ではないため、コントロールはすべて消えてしまい、答えが失われます。

テキストボックスを常にそこに置いて、代わりに JavaScript でCSS 可視性プロパティを設定してみませんか? サンプル関数 (ソースはhere ) は次のとおりです。

<script type="text/javascript">
    function toggleVisibility(controlId)
    {
        var control = document.getElementById(controlId);
        if(control.style.visibility == "visible" || control.style.visibility == "")
            control.style.visibility = "hidden";
        else 
            control.style.visibility = "visible";

    }
</script>

したがって、代わりにドロップダウンのClickイベントでこの関数 (またはラッパー関数) への呼び出しをバインドし、常にページにテキスト ボックスを非表示にします。そうすれば、すべての回答が完了して送信されるまでポストバックする必要はありません。

于 2013-05-09T21:44:26.750 に答える