1

詳細ビュー内に、あるテーブルから値を取得し、選択した値を別のテーブルにバインドするドロップダウンリストがあります。私が抱えている問題は、ポストバックが発生するたびに、ddl 値を取得しているテーブルがデフォルトの読み取りに戻されることです。これにより、選択された値が常に null (リストの最初の値) に変更されます。

page_load に !IsPostBack を入れてみました:

   if (!IsPostBack)
   {
        DetailsView1.DataBind();
   }

最初のリストに依存する2番目のddlがありますが、それは正常に機能しています。常にnullであり、選択した値を保持しないのは最初のリストです。

最初の ddl は次のとおりです。

  <asp:DropDownList ID="DropDownList1" runat="server" AppendDataBoundItems="True" 
    AutoPostBack="True" DataSourceID="SQLLEAVECODE" DataTextField="LEAVETYPE" 
    DataValueField="LEAVECODE" Height="18px" style="text-transform:uppercase;"
    onselectedindexchanged="DropDownList1_SelectedIndexChanged"
    SelectedValue='<%# bind("reqleavecode") %>' Width="145px">
    <asp:ListItem></asp:ListItem>
  </asp:DropDownList>

私はこれを理解できないようです.私のバインディングに関係があるのではないかと思います.

    public string lvtype;
    public string lvrequest;

    private DataSet GetData()
    {
        ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        var sql = "SELECT LEAVETYPE, LEAVECODE FROM TESTBWTIME.BWLVTYPE ORDER BY LEAVECODE";

        using (iDB2Connection conn = new iDB2Connection(GetConnectionString()))
        {
            conn.Open();

            using (iDB2Command cmd = new iDB2Command(sql, conn))
            {
                cmd.DeriveParameters();

                using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
                {
                    DataSet ds = new DataSet();
                    da.Fill(ds);

                    return ds;
                }
            }
        }
    }

    private String GetConnectionString()
    {
        ConnectionStringSettingsCollection cssc = ConfigurationManager.ConnectionStrings;

        return cssc["connStringNET"].ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        DropDownList ddl1 = (DropDownList)(DetailsView1.FindControl("DropDownList6"));
        DropDownList ddl2 = (DropDownList)(DetailsView1.FindControl("DropDownList5"));
        DataSet ds = GetData();
        if (!Page.IsPostBack)
        {
            ddl1.DataSource = ds;
            ddl1.DataBind();
            lvtype = ddl1.SelectedValue;

            ddl2.DataSource = ds;
            ddl2.DataBind();
            lvrequest = ddl2.SelectedValue;
        }
        else
        {
            lvtype = ddl1.SelectedValue;
            lvrequest = ddl2.SelectedValue;
        }
       }
4

1 に答える 1

0

私は同じ問題を抱えていました。次の手法を使用して解決します。必要に応じてこのコードを変更してください。基本的に、そのクラスに対してグローバルな、つまり上部に 2 つの変数が必要です。そして、ポストバックでドロップダウンリストの選択された値と、次のように選択されたインデックス付きの変更されたイベントを取得できます。

public string vendorId;
public string categoryId;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        dropDownListVendor.DataSource = CatalogAccess.GetVendors();
        dropDownListVendor.DataBind();
        vendorId = dropDownListVendor.SelectedValue;

        dropDownListCategory.DataSource = CatalogAccess.GetCategoriesInVendor(vendorId);
        dropDownListCategory.DataBind();
        categoryId = dropDownListCategory.SelectedValue;
    }
    else
    {
        vendorId = dropDownListVendor.SelectedValue;
        categoryId = dropDownListCategory.SelectedValue;
    }
}

protected void dropDownListVendor_SelectedIndexChanged(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        dropDownListCategory.DataSource = CatalogAccess.GetCategoriesInVendor(vendorId);
        dropDownListCategory.DataBind();
    }
}
于 2012-08-23T15:03:01.817 に答える