- PR -

DropDownListのアイテム追加について

投稿者投稿内容
萌衣
会議室デビュー日: 2006/06/19
投稿数: 17
投稿日時: 2006-07-10 14:56
説明がうまくなくてごめんなさい^^;

省略というのは、この掲示板に記述しなかったという意味で

実際の記述は

if(!IsPostBack)
{
foreach(..........)
{
別の処理
}

  DataSet Syain = new DataSet( "社員" );
  DataTable syainTable = new DataTable( "社員テーブル" );
  Syain.ReadXml( @"C:\conf\社員.xml" );

  foreach( DataRow row in Syain.Tables[ "社員テーブル" ].Rows )
  {
    ddlID.Items.Add( row[ "社員ID" ].ToString() );
  }
}
となっています。


>どっとねっとふぁんさん

 DataSetは、別々の物でファイル自体も違うものを作成してあります。



[ メッセージ編集済み 編集者: 萌衣 編集日時 2006-07-10 14:58 ]

[ メッセージ編集済み 編集者: 萌衣 編集日時 2006-07-10 14:59 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-07-10 15:10
私が前に書いたPage_Loadが2回呼ばれている、という話だったら、別の処理の
ほうが1回しか実行されない、という部分が説明できないですね。
省略されているプログラムがあやしいんじゃないか、としか言えないかなぁ。
カルガモ
常連さん
会議室デビュー日: 2006/06/27
投稿数: 20
投稿日時: 2006-07-10 15:22
ということは、
話は前後しますが、
・if(!IsPostBack)が何回呼ばれているか?
(たぶん複数回呼ばれている?)
・複数回if(!IsPostBack)が実行されている場合、foreachの条件によって
実行されているのか?
(条件が異なっていれば可能性有り)

if(!IsPostBack)の頭にプレー九ポイントを張って確認してください。
萌衣
会議室デビュー日: 2006/06/19
投稿数: 17
投稿日時: 2006-07-10 15:23
>どっとねっとふぁんさん

 念のために、省略した部分のコードも記述します。

//画面に貼り付けられてるコントロールのすべてを検証
foreach( object obj in this.Controls )
{
//コントロールが<Form>タグ内のコントロールだったら
if( obj is HtmlForm )
{
//<Form>内タグのコントロールすべてを検証
foreach( object ctrl in ((HtmlForm)obj).Controls )
{
//ドロップダウンリストだったら
if( ctrl is DropDownList )
{
//ドロップダウンリストオブジェクトの取得
DropDownList ddlList = (DropDownList)ctrl;
//コントロールID名に"Ikisaki"の文字が入っていたら
if( ddlList.ID.IndexOf( "Ikisaki" ) != -1 )
{
          IkisakiRefresh( ddlList, ds.TableInfo);
        }

        //コントロールID名に"Norimono"の文字が入っていたら
        else if( ddlList.ID.IndexOf( "Norimono" ) != -1 )
        {
          NorimonoRefresh( ddlList, ds.TableInfo);
        }
        //コントロールID名に"Station"の文字が入っていたら
        else if( ddlList.ID.IndexOf( "Station" ) != -1 )
        {
          KukanRefresh( ddlList, ds.TableInfo);
        }
      }
    }
  }
}

このように記述しています。

IkisakiRefreshなど「Refresh」がついてるものは
それに対応したXMLファイルの行をアイテムとして追加する
というものを作成したものです。

今回のIDを記述する以前に作成したものですが、コレが原因になっているのでしょうか。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-07-10 15:48
これ、同じds.TableInfoを各関数に渡してますよね。
それぞれの関数のなかで同じxmlファイルを読み込んでませんか?
たとえば、

・IkisakiRefreshの中でa.xmlファイルを読み、その中の必要な部分だけとりだしてドロップダウンリストに追加。
・NorimonoRefreshの中でやっぱりa.xmlファイルを読み、その中の必要な部分だけ取り出してドロップダウンリストに追加。

こんな処理になっていないでしょうか。
で、ds.TableInfoの中身がクリアされていないので、同じデータを2回追加してしまっている、ということが起きてはいないでしょうか。

それが一番あやしそうな気がします。

萌衣
会議室デビュー日: 2006/06/19
投稿数: 17
投稿日時: 2006-07-10 15:59
>カルガモさん

 if(!IsPostBack)にブレークポイントを置いて
 確認したところ、すべてを通ったあとに
 またif(!IsPostBack)を通っていました。
 その後、先ほど記述した「省略していたコード」にもループが回って
 いるのですが、最終的に表示されるものは
 省略していた方が正常に表示されていて
 IDだけが2回分のアイテムが表示されています。

 ドロップダウンリスト(ID)の表示は次のようになっています

 000
001
002
003
004
005
006
007
000
001

 ・
萌衣
会議室デビュー日: 2006/06/19
投稿数: 17
投稿日時: 2006-07-10 16:05
>どっとねっとふぁんさん

>・IkisakiRefreshの中でa.xmlファイルを読み、その中の必要な部分だけとりだしてドロップダウンリストに追加。
・NorimonoRefreshの中でやっぱりa.xmlファイルを読み、その中の必要な部分だけ取り出してドロップダウンリストに追加。

こんな処理になっていないでしょうか。
で、ds.TableInfoの中身がクリアされていないので、同じデータを2回追加してしまっている、ということが起きてはいないでしょうか。

それが一番あやしそうな気がします。


↑このような状態になっています^^;
ただ・・・、その部分に関しては問題なく動作をしていて
この後のコード(最初に記述したコード)の方が問題が発生しています。

このような、他の部分の処理が原因で問題が発生することもあるのでしょうか?

[ メッセージ編集済み 編集者: 萌衣 編集日時 2006-07-10 16:25 ]
カルガモ
常連さん
会議室デビュー日: 2006/06/27
投稿数: 20
投稿日時: 2006-07-10 16:23
まず問題点を整理しましょう。
といっても一つしかありませんが、
・ドロップダウンコントロールのアイテム追加処理が
2回呼ばれる。けっか、アイテムに不必要なものが追加される。(同じもの)

コードを見た限り、コントロールの初期処理を行っているようですが、
そうだとすると、
この処理は1度だけ処理されれば良い。ということになります。
ということは2回処理されることに問題があるのではと思います。

アイテムの更新処理の場合はアイテムのクリアを行い、
この処理を1度だけ呼び出してあげればいいかと思います。

気になるのが
foreach( object obj in this.Controls )
{
}
内の先ほど省略された処理ですが、
この条件に合致しないことが一度発生していることになります。
この条件となると結構限られてくるかと思います。
例えばコンストラクタ内のInitializeComponent()
以前に呼び出していたりとか、、
(動的にコントロールを配置している場合はそれ以前に呼び出している)
thisが勝手にフォームと仮定していますが、、。
グループボックスも同様ですね。
コントロールのインスタンスを生成する前に実行されている可能性があります。

とりあえずはこの処理を1度だけ呼ぶようにすることが
解決の糸口になるかもしれません。

スキルアップ/キャリアアップ(JOB@IT)