2011年08月05日

webサーバーでデバッグを開始できません

WindowsXPでVisual Studio 2010を使ってWebアプリを作成中、途中からIISを入れてWebサーバ上でデバッグしようとしたところ、「webサーバーでデバッグを開始できません」というエラーが出た。(下図)

エラー画面

散々調べまわった挙句、ヘルプに書かれた次の一言で原因が判明。
ローカル コンピューター (Visual Studio を実行するコンピューター) で、Visual Studio をインストールした後に IIS をインストールしましたか。 IIS は、Visual Studio の前にインストールする必要があります。 後でインストールすると、ASP.NET の再登録が必要になることがあります。

ASP.NETを再登録するには
コマンド プロンプト ウィンドウで、「systemroot\Microsoft.NET\Framework\ versionNumber \aspnet_regiis -i」というコマンドを実行します。 (下図)

ASP.NETの再登録

これで無事デバッグができるようになった。...確か以前にも同じ羽目に陥ったと記憶している(^^;

posted by なっちゃん at 20:22| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2011年04月20日

ListViewのページングの問題点。ページ位置を初期化(リセット)させるには

ASP.NET 3.5から採用されたListViewコントロールにページング機能を付ける場合、DataPagerというコントロールを使う。
これは便利なのだが、一つ困ったことに、データ表示する条件を変えて再表示させると前回のページ位置を保持して先頭ページから表示しないというバグ(?)がある。
具体的に言えば、条件無しで全30件のデータを1ページ10件で表示したとする。
2ページ目に移動した後、条件を変えて検索し結果が13件あったとすると、2ページ目の3件を表示してしまう。先頭から表示するのが普通だと思うがそうならない。
そこで、検索時にDataPagerをリセットさせて先頭ページから表示させようと思うのだが、
これが結構難題だった。プロパティで簡単にできるかと思ったのだが、そのようなプロパティは無く、結局内部でイベントを発生させて先頭に移動させる方法が必要だった。

参考にした海外のサイト:http://leedumond.com/blog/resetting-the-page-index-in-a-listview/

ページ移動する場合は、DataPagerのOnPagerCommandメソッドで指定されたイベントで先頭ページ(NewStartRowIndex)を指定するが、再検索時にこのイベントを強制的に発動させる必要がある。

'- 1ページ目から表示させる処理 --
Private Sub PagerReset()
Dim dp As DataPager = ListView1.FindControl("pager")
If Not dp Is Nothing Then
'リセット用もしくは先頭ページへのコマンドを指定
Dim cmdEventArgs As CommandEventArgs = New CommandEventArgs("Reset", "")
Dim tempPagerField As TemplatePagerField = dp.Fields(0)
If Not tempPagerField Is Nothing Then
'ここでPagerCommandのイベントが処理される
tempPagerField.HandleEvent(cmdEventArgs)
End If
End If
End Sub
posted by なっちゃん at 15:33| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2011年02月14日

TextBoxにフォーカスを当てたとき、選択状態(反転)させるには

ブラウザ上のテキストボックスをタブキーなどで移動すると自動で文字列が選択状態となっている。しかし、ロード時にTextBox.Focusとやってもカーソルは移動しているが選択状態つまり反転はしていない。これを実行するには以下のようにすると良い。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
If Not IsPostBack Then
TextBox1.Text = "あいうえお"
TextBox1.Attributes.Add("onfocus", "this.select();")
TextBox1.Focus()
End If
End Sub


posted by なっちゃん at 10:57| 静岡 ☁| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年10月20日

半角カタカナは全角に、全角の英数字、記号、スペースは半角に変換

Webアプリなどで入力した文字列を半角や全角で統一したい場合に使えます。
※Imports System.Text.RegularExpressions の宣言を忘れずに

'/// 半角カタカナは全角に変換し、全角英数字記号は半角に変換 //////
Public Function ConvANK(ByVal moto As String) As String
'-- 全角の英数字、記号、スペースを半角に --
Dim re As Regex = New Regex("[0-9A-Za-z:,. ]+")
Dim output As String = re.Replace(moto, AddressOf myReplacer)
'-- 半角カタカナ(Unicodeで\uFF61-\uFF9Fが範囲)を全角に --
Dim re2 As Regex = New Regex("[\uFF61-\uFF9F]+")
Dim output2 As String = re2.Replace(output, AddressOf myReplacer2)
Return output2
End Function

'/// 半角変換 ///
Shared Function myReplacer(ByVal m As Match) As String
Return Strings.StrConv(m.Value, VbStrConv.Narrow, 0)
End Function

'/// 全角変換 ///
Shared Function myReplacer2(ByVal m As Match) As String
Return Strings.StrConv(m.Value, VbStrConv.Wide, 0)
End Function

posted by なっちゃん at 15:16| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年10月19日

ASP.NET AjaxでMsgBoxを使う

以前「ASP.NETでMsgBox(もどき)を使う」を紹介したが、これはASP.NET Ajax上ではエラーになる。
そこで、Ajax上(UpdatePanel内)でも動作する新バージョンを紹介する。

'//// Ajax対応版MsgBox //////
Private Sub AjaxMsgBox(ByVal msg As String)
Dim strScript As String = "alert('" & msg & "');"
ScriptManager.RegisterClientScriptBlock(UpdatePanel1, Me.GetType(), _
"msgbox", strScript, True)
End Sub
posted by なっちゃん at 20:49| 静岡 ☁| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年10月07日

「プレフィックスの最大数を超えています...」エラーの顛末

ASP.NET3.5でListViewを使ったWebアプリでデータの更新(UpdateCommand)を実行しようとしたときエラー「数値 名'System.Web.UI.WebControls' プレフィックスの最大数を超えています。最大数は 3 です。」が発生した。

デバッグポイントを追ってみたらListViewのEditItemTemplateのコントロールからデータを取得している最中に起こっているらしいことが判った。「プレフィックスの最大数」でググッてみるとほとんどがデータベース(SQLServer)に関する問題なので、それ以前に発生しているのが変だなと思っていたところ何度もデバッグするうちにエラーの発生する箇所が特定できないことが判った。
ステップオーバーで一行ずつ確認してみると早くエラーすることもあれば最後まで取得可能な場合もある。当初はコントロールからの取得に問題があると考え、しかも「System.Web.UI.WebControls」と表示されているのでコントロールに問題があるとばかり考えていろいろ修正してみたのだが、一向にエラーがなくならない。同僚にも確認してもらデバッグの状態を調べているうちに、とんでもない間違いを見つけた。全てはそれが原因だった。

コントロールから変数を取得する際、TextBox1.Textとすべきところを、TextBox1.ToStringとしていたのだ。その結果、'System.Web.UI.WebControls.TextBox'という文字列がSQL文に含まれ、これを解釈した結果が「プレフィックスの最大数を超えています」になったのである。ここにはドット(.)が4つ、つまりプレフィックスが4つになっていたのだ。VisualStudioのコード入力支援で自動メンバ表示で誤って選択してしまった結果である。
またデバッグ箇所が特定できなかったのも解決に時間が掛かった原因でもある。ステップさせても突然先に進んでエラー箇所に行く前にエラーメッセージが出てしまうことがこれまでにも何度かあった。

また、このテストの過程で再確認したことがある。
それはTextBoxから変更された値を取得しようとしても ReadOnlyプロパティがTrueになっていると変更値が取得できないということだ。
posted by なっちゃん at 09:04| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年08月09日

AjaxContorlToolkit を使った時のエラー

VS2008(sp1)でASP.NET3.5の開発をしていてAjaxControlToolkitのModalPopupExtenderを使った際、以下のようなエラーが発生した。

「Microsoft JScript 実行時エラー: AjaxControlToolkit requires ASP.NET Ajax 4.0 scripts. Ensure the correct version of the scripts are referenced. If you are using an ASP.NET ScriptManager, switch to the ToolkitScriptManager in AjaxControlToolkit.dll.」

JScript実行時エラー

単純に翻訳するとASP.NET Ajax 4.0が必要だという意味になるが、ASP.NET3.5にVS2010開発環境のASP.NET4.0を使えというのは変だろう?
実際ダウンロードして使おうとしてもバージョンが違うと言われて実行すらできない。

そこでいろいろ調べてみた結果。Ajaxを利用する時に使う「ScriptManager」をAjaxControlToolkitツールボックスにある方の「ToolkitScriptManager」に変更するだけでエラーが解消されることが判った。

変更箇所

何故こうするとエラーが解消されるのかはよくわからない。
ToolkitScriptManagerについては山田祥寛氏の以下の説明を参考に。
「参考:ToolkitScriptManagerコントロール」
posted by なっちゃん at 10:35| 静岡 ☔| Comment(5) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年01月26日

コントロールの描画エラー

久しぶりに昔のプログラムを修正することになりプロジェクトを開いたところ画面のコントロールに下図のようなエラーが表示された。
「コントロールの描画エラー−HyperLink1 ハンドルされていない例外が発生しました。オブジェクト参照がオブジェクトインスタンスに設定されていません。」

コントロールの描画エラー

HyperLinkを貼り直してもエラーが消えない。イメージファイルを指定しなければ問題ないし、またエラーしてもビルドは正常に行える。

以前はちゃんと開いていたのに何か環境が変わってしまったのかと思い調べてみたところどうやらMicrosoftのWindowsUpdateで更新した結果このような現象が起きることが判った。
パッチも公開されているのでそれを適用したところ、無事解消された。

パッチの提供場所
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=18157

パッチ画面
posted by なっちゃん at 12:28| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2009年11月05日

アップロード可能なファイルサイズの上限変更

FileUploadコントロールを使ってWebサーバにファイルをアップロードさせるときファイルサイズの上限があることをご存知だろうか?

そんなことを何も意識せず普通に使った場合(Web.Config等に何も指定していない場合)では、上限初期値が4MBになっている。これを超えるとエラーになる。

最初はサイズが原因だとは思わなかったが、どうやらそうらしい。

設定変更はWeb.Configで行う。

system.web要素に次の項目を追加する。

<httpRuntime executionTimeout="600" maxRequestLength="40960"/>

executionTimeout:実行タイムアウト(秒)初期値110
maxRequestLength:リクエストデータ最大サイズ(KB)初期値4096(=4MB)

※location要素と組合せて必要なページのみ指定できるそうだが私は確認していない。
posted by なっちゃん at 12:45| 静岡 ☀| Comment(1) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2009年09月03日

チェックボックス、ラジオボタンを大きく表示して使う:その2

以前掲載した「チェックボックス、ラジオボタンを大きく表示して使う」では、WebコントロールのCheckBoxやRadioButtonでは大きく表示できないためHTMLコントロールを使う方法を紹介しました。

それに対してコメントを寄せてくれた蒼い音速鼠さんの情報によりWebコントロールでも可能なことが判り、また前回のサンプルソースではIE8に対応できない問題も解決することができました。

そこで改正版サンプルを作成しましたので紹介します。
bigctrsamp2.lzh(24KB)
・Default.aspx: HTMLコントロールによるサンプル
・Default2.aspx: Webコントロールによるサンプル

Webコントロールでサイズを変更するにはInputAttributesプロパティでスタイルの設定を行えば良いこと。
IE8でも有効にするにはスタイルにborder:noneやborder-width:1pxを加えれば良いことが判りました。

蒼い音速鼠さんありがとうございました。

その後、更にmidorikawaさんよりコメントをいただき、もっと簡単な記述でWebコントロールを大きく表示する方法が判りました。(IE7〜IE9はOK、IE6はNG)下のコメント欄をご覧ください。
posted by なっちゃん at 11:46| 静岡 ☔| Comment(2) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年10月20日

異なるバージョンのASP.NETを1台のIISで同時に動かすために

客先のアプリケーションサーバー(Windows2003Server)にASP.NET2.0で作ったWebアプリケーションをインストールしたところ、既存のアプリケーションが動作不良になってしまった。
こちらはASP.NET 1.1を使ったものでこちらを有効にさせると今度は2.0の方が動かなくなってしまった。

イベントログを見たところ次のような記述があった。
同じ IIS プロセスで、異なる 2 つのバージョンの ASP.NET を実行することはできません。サーバーを再構成して、異なるプロセスでアプリケーションを実行するには、IIS 管理ツールを使用します。

マイクロソフトのサイトに対応策が載っていた。
http://msdn.microsoft.com/ja-jp/library/1kdfe21k.aspx

説明文:
このエラーは、複数のバージョンの ASP.NET が同じプロセスを実行するように構成されている場合に発生します。これは、異なるバージョンの .NET Framework とランタイムは同じプロセス内で side-by-side 実行できないためです。このため、ランタイムの特定のバージョンを使用する ASP.NET アプリケーションは、異なるバージョンを使用するアプリケーションとプロセスを共有させないでください。一般的に、このエラーは、複数のアプリケーションが ASP.NET の異なるバージョンに割り当てられているのに、同じアプリケーション プールを共有するときに発生します。

つまり、アプリケーションプールを別に用意して割り当てれば良いということだ。
これを実行したところ、両バージョンとも正常に動作するようになった。
posted by なっちゃん at 10:30| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

ASPでODBC経由でのデータベース接続の注意

客先でAS400のデータをレガシーASPで利用する際、ODBC(iSeries Access for Windows ODBC)を利用したのだが、何故かエラーして繋がらなかった。
ACCESSを使ってテーブルのリンクをすると問題無く開くのに、ASPからだとエラーになってしまう。
その時のエラーが「[Microsoft][ODBC Driver Manager]データソース名および指定された既定のドライバが見つかりません」というものだった。
マイクロソフトのサポートページ http://support.microsoft.com/kb/306345/ja
をみてためしたがやはり駄目。
仕方なくその日は諦め、翌日同僚に状況を話したところ、システムDSNでないとASP側からは接続できないと指摘があった。なるほど、そうだ!ログインしたユーザーが操作するACCESSと違い、ASP経由では別のユーザーになっていることを忘れて、何も考えずユーザーDSNに登録していたのだ。
ということで、改めてシステムDSNに登録して無事解決した。

ASPでのODBC接続はシステムDSNを使わねばならない。
posted by なっちゃん at 10:25| 静岡 ☁| Comment(3) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年09月25日

レガシーASPの開発は最新のVisualStudio2008 SP1で

前回わけ在ってASP.NETではなく旧ASP(レガシーASP)で開発することになった顛末を紹介した。
ASP開発にはこれまでずっとVisualStudio6.0のInterDevを使っていたので今回も当然使った。ところが、データベースに接続するところでSQLServer2005には問題なく接続できるのに、Access2002(2000)にはどうやっても接続できない現象が現れた。しかも、InterDevを使わなければ接続できることもあるので困ってしまった。

そうしたなか、VisualStudio2005で使えないかと調べているうちに山田祥寛氏の記事(PDF)を見つけた。ほんの最近公開されたものであるが、そのなかにVisualStudio2008SP1では「レガシーASPの開発サポートを復活」と書かれているのを発見した。

さっそく無償のExpress版のVisual Web Developer 2008 Express Edition をダウンロードして使ってみたところ、素晴らしいではないか。見事にASPを統合環境で使える。しかも、InterDevではエラーしまくっていたのに、何も手を加えずとも全く問題なくAccessのデータが読めるようになった。

一時は、テキストエディターだけで開発しようかと思っていたのでVisualStudioの開発環境が使えることは大いに助かった。

VWD2008Express(sp1)の画面
ツールボックスにはHTML関係だけがある。
InterDevではデザイン画面がまともに開けることの方が少なかったがこちらはかなり使えそうだ。
posted by なっちゃん at 11:53| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年09月10日

レガシーASPで開発

今ASP.NETではなく以前によく作ったASPで開発している。
というのも、今回の開発では通常のパソコンで動くブラウザではなく、ハンディーターミナル(デンソーウェーブのBHT-500)で動くブラウザをターゲットとしているためだ。
最初はASP.NETでやるつもりだったのだが、あまりにレスポンスが悪いため断念せざるを得なかった。
もう4年以上ASPでは開発していないので戸惑うことしばしばであるが、レスポンスは抜群によい。もともとハンディーターミナルという小さい画面の表示文字数にも制限のある環境なのでデザイン的に凝ることもないのでASPで正解だった。

使ってみると確かにHTMLとプログラムが入り混じってごちゃごちゃした感じだが、ASP.NETのコントロールが自動的に作成するコードが無い分、こちらで記述したコードだけが最短で処理されている感じがして、実にキビキビと動く。
ASP.NETばかりでなく、システムによってはASPで開発することも考慮していいかも。

posted by なっちゃん at 14:17| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年06月26日

チェックボックス、ラジオボタンを大きく表示して使う

テキストボックスやコマンドボタンはフォントのサイズや縦(Height)横(Width)を直接指定することで大きく表示することができる。しかし、チェックボックスやラジオボタンは文字の方は大きくできてもコントロールはサイズが変わらない。

年配の方やタッチスクリーンを使っている場合、見やすく操作し易いようにするためにこの部分を大きくできないかという依頼があったとき、正直こんなに苦労するとは思わなかった。

いろいろ試行錯誤した挙句、完成したのがこのサンプルのような使い方である。
サンプルソース:bigctrsamp.lzh (2008.07.03修正)

※このサンプルが有効なのはIE7までです。IE8だと互換表示を使ってもボタンを大きくすることはできません。(2009.09.02)

※こちらで新しいサンプルを紹介しています。WebコントロールでもIE8でも使えるサンプルです。チェックボックス、ラジオボタンを大きく表示して使う:その2」(2009.09.03)

サンプル実行図
サンプル実行図

サーバーコントロールはWebコントロールではなくHTMLコントロールを使う。Webコントロールではどうしても大きくできない。また、サーバーサイドで利用するため「サーバーコントロールとして実行」を有効にするが、クライアントサイドのJavascriptでGridView内のラジオボタンを操作する方法も組み込んである。

デザイン全体図
デザイン全体

サーバーコントロールとして実行
サーバーコントロールとして実行

サイズを指定
サイズを指定

ラジオボタンのクライアントスクリプトでは一度ブラウザで表示された状態のソースコードで名前を調べる。

GridViewのソースコード
GridViewのソースコード

このソースコードから、ラジオボタンのName属性がGridView2$ctlXX$であることが判る。XXはどういうわけか02から始まる。そこでこれを操作するJavascriptも先頭が02となるように細工をする。

Javascritpコード
Javascriptコード

なお、GridViewの行数をHiddenFieldの値から取得しているが、これは以前のTipsでも紹介した方法「データソースで取得したレコードの件数を知るには」を使っている。
posted by なっちゃん at 18:44| 静岡 ☔| Comment(6) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年03月26日

ポップアップブロック回避策

ASP.NETに限らずWebシステムではJavascriptのwindow.open()を使いサブウィンドウを開く場面がよくある。
これがWindowsXP ServicePack2から導入され、Googleツールバーにもあるポップアップブロックによって、効かなくなることがある。それぞれ設定を解除させれば良いが、今回紹介するのは設定解除することなく、回避する方法である。

調べてみると意外に簡単に方法が見つかった。
そもそもポップアップブロックはユーザーが自らの意思でボタンを押したものには働かない。自動で(勝手に)開くウィンドウを阻止するものである。よってサーバーサイドで実行したものは必ずブロックされてしまう。
そこでクライアントサイドのOnClickイベント内で開くように変更すれば良いのである。

例:onclick="window.open('hoge.aspx');return false;"
※最後のreturn falseはonclckイベントを最終的にキャンセルさせることでwindow.open()だけを実行させる意味がある。

ただ、このサーバーサイドからクライアントサイドへの変更には結構問題が起こる。特に入力フォームの内容を取得してからでないと次の処理を決められないときなど一度ポストバックが必要な時がそれにあたる。この点に関しては事前に入力フォームのイベント内でポストバックさせて取得しておくしかない。

サンプルはこちら−>popup.lzh

なおサンプルをテストする場合、開発環境からの実行ではポップアップブロックが無視されるのでIIS等でサイトを立てて実行すること。またURLにlocalhostを使うとローカルイントラネットゾーンとなりこれもポップアップブロックが解除される(但しGoogleツールバーのポップアップブロックは有効)。IPアドレスを指定すればインターネットゾーンになりポップアップブロックが有効になるので、回避の効果が確認できる。

サンプルの実行画面

1.起動画面
上の段がサーバーサイドでのwindow.openでポップアップブロックが掛かってしまう。下の段がその回避策である。
サンプルの起動画面

2.ポップアップブロックが効いた
ポップアップブロックが効いた

3.Googleツールバーのポップアップブロックが効いた
Googleのポップアップブロック

4.ポップアップブロック回避策で無事オープン
回避策
posted by なっちゃん at 17:15| 静岡 ☀| Comment(1) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年12月10日

データソースで取得したレコードの件数を知るには

ASP.NETでよく使うGridViewのページング機能では、何ページあるかおおよそ分かっても、全レコード数が幾つあるかは分からない。

そこで全レコード数を取得する必要があるが、そのためだけにデータベースにアクセスするのは避けたい。そこで調べたところ便利な機能があった。

GridViewではSqlDataSourceをバインドしてデータを取得するが、このデータソースのSelectイベントのなかで表示される全レコード数が取得できる。

Dim recCount as Long
Protected Sub SqlDataSource1_Selected(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.SqlDataSourceStatusEventArgs)
recCount = e.AffectedRows
End Sub

e.AffectedRows をヘルプで調べると「データベース操作の影響を受けた行の数を取得」とある。
あとは、GridViewのDataBoundイベントのなかで取得した値を表示する処理を追加するだけである。

posted by なっちゃん at 11:56| 静岡 ☀| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年09月04日

ASP.NETのログイン画面をスキップさせる(自動ログイン)

ASP.NET2.0のログインコントロールは大変便利である。セキュリティを掛けたページを開こうとすれば自動でログイン画面が表示される。仕組みもブラックボックス化されているのでコントロール(loginコントロール)を貼り付けるだけで済んでしまう。

ところで、最近手がけた仕事でセキュリティは保ちたいがログイン画面で入力するのが面倒だから何とかならないかという相反するリクエストがあった。
普通であれば「その程度の面倒臭さは仕方ありません、我慢してください(^^)」と答えるところだが、ユーザーがパソコン初めての年配の方々の集まりということ(^^;で何とかしましょうということになった。

で、考え出したのが下図のような自動ログインの仕組みである。
ユーザー名とパスワードを引数としてログインページに渡すというもの。
セキュリティ上若干問題があるが、それは仕方ない。優先すべきは「入力しない」ことだから。

自動ログインの仕組み

詳しくはサンプルソースで確認してもらいたい。
ログイン画面はログインコントロールのデザイン部分を利用しているが、ログインコントロールではなく、テキストボックスとボタンコントロールの組み合わせである。認証の部分をプログラムで行っている。といっても複雑ではない。たった2行でOKだ。

サンプルソース:autologin.lzh
※解凍後「サンプルの使い方.html」を参照
posted by なっちゃん at 21:09| 静岡 ☁| Comment(0) | TrackBack(1) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2007年07月25日

DropDownListのAppendDataBoundItemsは問題あり

DropDownListにバインドしたデータとは別に「選択してください」とか「全て」とかいった非バインドデータを追加したいことがある。
この場合の処理で参考書とかによく掲載されているのがAppendDataBoundItemsプロパティを使う方法だ。しかし、実際の現場で使うときに非常に困った現象が起きる場合がある。
今回はその例と回避方法を紹介する。

DropDownListコントロールを単独で使う場合では問題は起きない。
どういう状況で起きるかといえば、データベースのリレーションによる階層(関連)データを絞り込む場合である。
下図サンプルは、OrderテーブルのOrderIDがCustomerIDとEmployeeIDによって絞り込まれる様子である。

1.DropDownListの標準使用では条件にあった件数(この場合は2件)分のデータがリストに追加される。(左DropDownList)

2.AppendDataBoundItemsを有効にした場合、2セット(4件)重複して追加されてしまう。(中央DropDownList)
これはページロード時に、CustomerIDのDropDownListとEmployeeIDのDropDownListにデータがバインドされる度にOrderIDのDropDownListに連動されてバインドが実行され、さらに自分自身がバインドした結果だと思う。

これを回避する方法はいろいろ試した結果、AppendDataBoundItemsプロパティを使わずに
3.Item.InsertメソッドをDataBoundイベントの中で実行する方法である。(右DropDownList)
余分に追加することがないように条件をつけてある。

DropDownListサンプル
※画面は合成したもの


'--上記2の処理--
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
If Not IsPostBack Then
ddlOrder.Items.Clear()
ddlOrder.Items.Add(New ListItem("全て", ""))
ddlOrder.AppendDataBoundItems = True
End If
End Sub
 
'--上記3の処理--
Private Sub ddlOrder2_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles ddlOrder2.DataBound
If ddlOrder2.Items.Count = 0 Or _
(ddlOrder2.Items.Count > 0 AndAlso ddlOrder2.Items(0).Text <> "全て") Then
ddlOrder2.Items.Insert(0, New ListItem("全て", ""))
End If
End Sub

posted by なっちゃん at 13:51| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

Web.Config には記述する順番がある

Web.Configには記述の順位が存在する。
普段ほとんど意識しないが、サードパーティのコンポーネントを利用しようとして「appSettings」を追加したら途端にコンパイルエラーになってしまい原因がWeb.Configに追加した場所にあることがわかった。

Web.Configの記述順位
posted by なっちゃん at 13:34| 静岡 ☁| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。