2016-09-06 15 views
0

GridViewで値showを取得した後、再度クリックするとDropDownListに重複した項目が含まれます。Asp.net dropdownlist data load load

public void Page_Load(object sender, EventArgs e) 
{ 
    string sql = "select distinct cproject from I.dd.project"; 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(sql, con); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     DropDownList1.Items.Add(dr[0].ToString()); 
    } 
    con.Close(); 
} 

public void button_click(object sender, EventArgs e) 
{ 
    sqldataadapter da = new sqldataadapter(Select * from lalala where id = '"+dropdownlist.item.selectedvalue.tostring()+"') 
    +"where A.cproject ='"+DropDownList1.SelectedValue.ToString()+"', con); 
    DataSet ds = new DataSet(); 
    sda.Fill(ds); 
    GridView1.DataSource = ds; 
    GridView1.DataBind(); 
} 
+0

(MVCを使用していると仮定して)ビューのスニペットを表示できますか?私の推測では、コントローラからのビューに渡す既存のモデルに追加しています。あなたがこれを提供できるなら、私は助けることができると思う:-) – Thumper

+0

あなたの質問に有効なコードを入れてください。 'public void Page_Load {'は無効です。 – mason

答えて

0

としてあなたはそれを書く必要があります:私はちょうど解決策を見つけた

public void Page_Load 
{ 
    if (!IsPostBack){ 
    string sql = "select distinct cproject from I.dd.project"; 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(sql, con); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
    DropDownList1.Items.Add(dr[0].ToString()); 
    } 
    con.Close(); 
    } 
} 

public void button_click 
{ 
    sqldataadapter da = new sqldataadapter(Select * from lalala where id = '"+dropdownlist.item.selectedvalue.tostring()+"') 
    +"where A.cproject ='"+DropDownList1.SelectedValue.ToString()+"', con); 
    DataSet ds = new DataSet(); 
    sda.Fill(ds); 
    GridView1.DataSource = ds; 
    GridView1.DataBind(); 
} 
+0

なぜdownvote?それはOPのための完全な答えを示しています。 – Thumper

+0

コードはコンパイルされず、実際の問題の内容は説明されていません。問題の説明を提供する必要があります。 – mason

+0

コードコンパイルが質問に答えるための要件であるところを指摘できますか?しかし、私はより多くの文脈が与えられているはずだと同意する。 – Thumper

0

Page_Load方法は、ポストバックが発生するたびに呼ばれている(たとえば、あなたがASP.NETボタンコントロールをクリックした場合など)。データはすでに最初の負荷で追加され、ViewStateに保存されていました。 2番目の要求では、再度追加します。 Page.IsPostBackプロパティを使用して、ポストバック中であるかどうかを検出できます。

public void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     // add items to drop down list 
    } 
} 

サイドノートでは、IDisposableインタフェースを実装する任意のオブジェクトが適切に処理されていることを確認してください。エラーを診断するのを避けるために、処理が完了したら処分されていることを確認する必要があります。 finallyブロックで.Dispose()に電話するか、usingステートメントでラップすることができます。 SqlCommandSqlConnection(これはプロパティ/フィールドではありません)and SqlDataReader all implement IDisposable`。

-1

コンパイル可能なコードがないと、ドロップダウンリストがページ読み込みの間に保持されているように見えます。つまり、コンテキストから外れることはありません(オブジェクトはメモリ内に残ります)。つまり、ページが読み込まれるたびに何度も何度も追加されています。おそらく、既存の値のチェックをしたい:

public void Page_Load() 
{ 
    string sql = "select distinct cproject from I.dd.project"; 
    con.Open(); 
    using(SqlCommand cmd = new SqlCommand(sql, con)) { 
     using(SqlDataReader dr = cmd.ExecuteReader()) { 
      while (dr.Read()) 
      { 
       //Have not tested the if statement... may need to correct it. 
       if(!DropDownList1.Items.Contains(dr[0].ToString())) { 
        DropDownList1.Items.Add(dr[0].ToString()); 
       } 
      } 
     } 
    } 
    con.Close(); 
} 
+0

明らかにMVCではありません。 – mason

+0

明らかに、なぜdownvoteですか? – Thumper

+1

いくつかの理由:最初の段落にMVCの無意味な言及があります。コードはコンパイルされません。 「決して文脈から外れることはない」とはっきりしておらず、どちらも「破壊」されていない(コードに関しては意味が全く異なる)。また、[DropDownList.Items.Contains](https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listitemcollection.contains(v = vs.110).aspx)では、それは 'ListItem'を受け取ります。新しいリスト項目を作成して渡したとしても、値チェックではなく参照チェックが行われている可能性があります。チェックするすべてのアイテムをループする必要があります。 – mason

-1

。 if(!Ispostback)をページのロードステートメントに入れます。

+0

すでにこれが記載されている既存の回答がある場合は、自分の回答を投稿する必要はありません。その答えの横にあるチェックマークをクリックすると、問題が解決されたことが示されます。 – mason

+0

多分私のインターネット速度が遅いので、私は返信を見ませんでした。次回に返信する前にリフレッシュします。 –