ASP.NET C# GridViewを使っているときにつまった点。
IDみたいな列は表示したくなかったので、非表示にしたら、値が取得できませんでした。
どうやら、データバインドされる前に非表示にするため、値が入っていないようです。
Visible="false"っていつ使うんだー!!><
●失敗したソース
<asp:BoundField HeaderText="ID" DataField="id" Visible="false"/>
非表示にしつつ、値を取得するには、
・データをバインドさせる
・その後に非表示にする
という手順を実施します。
データバインドは何もしなくて、通常のままです。
その後に「OnRowCreated」や「OnRowDataBound」でイベントを拾い、一行づつ非表示にします。
「OnRowCreated」「OnRowDataBound」の違いは、ポストバック時に実行されるかされないかです。
「OnRowCreated」は実行されます。
「OnRowDataBound」は実行されません。
記述方法は同じですので、ここでは「OnRowDataBound」を例にします。
・aspxファイル
<asp:GridView ID="GridViewList" runat="server" BackColor="White"
EmptyDataText="データがありません。"
AutoGenerateColumns="False" ForeColor="Black"
ShowHeaderWhenEmpty="True" Width="900px"
OnRowDataBound="GridViewList_RowDataBound">
<Columns>
<asp:BoundField HeaderText="ID" DataField="id" />
<asp:BoundField HeaderText="名前" DataField="name" />
<asp:BoundField HeaderText="郵便番号" DataField="postal_code" />
<asp:BoundField HeaderText="住所" DataField="address" />
<asp:BoundField HeaderText="電話番号" DataField="phone_number" />
</Columns>
</asp:GridView>
OnRowDataBound="GridViewList_RowDataBound"を記述します。
「"OnRowDataBound="・・・"」の部分はcsファイルで使用します。
・csファイル
protected void GridViewList_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Visible = false;
}
「GridViewList_RowDataBound」はapsxファイルに記述したOnRowDataBound名です。
例では、「ID」列を非表示にしています。
2013年11月13日水曜日
ASP.NET C# GridView 内コントロールボタンのイベントを取得する方法
ASP.NET C# GridView 内コントロールボタンのイベントを取得する方法です。
調べると、
ボタンがひとつの場合 と ボタンが複数の場合 と、
方法が異なるように書かれていますが、どちらも同じ方法でいこうと思います。
ボタンがひとつの場合、「SelectedIndexChanged」メソッドで選択された行を取得するとありますが、
どちらも「RowCommand」メソッドでいいと思いました。
さっそくソースです。
・apsxファイル
<asp:GridView ID="GridViewList" runat="server" BackColor="White"
EmptyDataText="データがありません。"
AutoGenerateColumns="False" ForeColor="Black"
ShowHeaderWhenEmpty="True" Width="900px"
OnRowCommand="GridViewList_RowCommand">
<Columns>
<asp:ButtonField Text="編集" ButtonType="Button" CommandName="EditData" />
<asp:ButtonField Text="削除" ButtonType="Button" CommandName="DeleteData" />
<asp:BoundField HeaderText="ID" DataField="id" />
<asp:BoundField HeaderText="名前" DataField="name" />
<asp:BoundField HeaderText="郵便番号" DataField="postal_code" />
<asp:BoundField HeaderText="住所" DataField="address" />
<asp:BoundField HeaderText="電話番号" DataField="phone_number" />
</Columns>
</asp:GridView>
OnRowCommand="GridViewList_RowCommand"を記述します。
「"OnRowCommand="・・・"」の部分はcsファイルで使用します。
ButtonField には「CommandName」を指定します。
「Cancel,Delete,Edit,Page,Select,Sort,Update」は予約済みのコマンド名なので、それ以外にします。
「CommandName="・・・"」の部分はcsファイルで使用します。
・csファイル
protected void GridViewList_RowCommand(object sender, GridViewCommandEventArgs e)
{
int rowIndex = Convert.ToInt16(e.CommandArgument);
GridView gridView = (GridView)e.CommandSource;
GridViewRow row = gridView.Rows[rowIndex];
string id = row.Cells[2].Text;
switch (e.CommandName)
{
case "EditData":
LabelMessage.Text = "EditDataボタンをクリック_" + id;
break;
case "DeleteData":
LabelMessage.Text = "DeleteDataボタンをクリック_" + id;
break;
}
}
「GridViewList_RowCommand」はapsxファイルに記述したOnRowCommand名です。
「e.CommandName」でボタンを区別します。
case "・・・"はapsxファイルに記述したCommandName名です。
「 id」は値の取得例です。
これが一番シンプルな方法かなあと思います。
調べると、
ボタンがひとつの場合 と ボタンが複数の場合 と、
方法が異なるように書かれていますが、どちらも同じ方法でいこうと思います。
ボタンがひとつの場合、「SelectedIndexChanged」メソッドで選択された行を取得するとありますが、
どちらも「RowCommand」メソッドでいいと思いました。
さっそくソースです。
・apsxファイル
<asp:GridView ID="GridViewList" runat="server" BackColor="White"
EmptyDataText="データがありません。"
AutoGenerateColumns="False" ForeColor="Black"
ShowHeaderWhenEmpty="True" Width="900px"
OnRowCommand="GridViewList_RowCommand">
<Columns>
<asp:ButtonField Text="編集" ButtonType="Button" CommandName="EditData" />
<asp:ButtonField Text="削除" ButtonType="Button" CommandName="DeleteData" />
<asp:BoundField HeaderText="ID" DataField="id" />
<asp:BoundField HeaderText="名前" DataField="name" />
<asp:BoundField HeaderText="郵便番号" DataField="postal_code" />
<asp:BoundField HeaderText="住所" DataField="address" />
<asp:BoundField HeaderText="電話番号" DataField="phone_number" />
</Columns>
</asp:GridView>
OnRowCommand="GridViewList_RowCommand"を記述します。
「"OnRowCommand="・・・"」の部分はcsファイルで使用します。
ButtonField には「CommandName」を指定します。
「Cancel,Delete,Edit,Page,Select,Sort,Update」は予約済みのコマンド名なので、それ以外にします。
「CommandName="・・・"」の部分はcsファイルで使用します。
・csファイル
protected void GridViewList_RowCommand(object sender, GridViewCommandEventArgs e)
{
int rowIndex = Convert.ToInt16(e.CommandArgument);
GridView gridView = (GridView)e.CommandSource;
GridViewRow row = gridView.Rows[rowIndex];
string id = row.Cells[2].Text;
switch (e.CommandName)
{
case "EditData":
LabelMessage.Text = "EditDataボタンをクリック_" + id;
break;
case "DeleteData":
LabelMessage.Text = "DeleteDataボタンをクリック_" + id;
break;
}
}
「GridViewList_RowCommand」はapsxファイルに記述したOnRowCommand名です。
「e.CommandName」でボタンを区別します。
case "・・・"はapsxファイルに記述したCommandName名です。
「 id」は値の取得例です。
これが一番シンプルな方法かなあと思います。
ASP.NET C# ファイルダウンロード時に日本語ファイル名が文字化けする対応
ASP.NET コードC#で、
CSVファイルを生成しダウンロードできるようにしたのですが、
日本語ファイル名が文字化けする!!
調べてみると、なるほど、
Microsoftが既にそうゆう事象があることを言っているんですね。
●ファイルをダウンロードする ASP.NET ページで日本語ファイル名が文字化けする
http://support.microsoft.com/kb/436616/ja
そしてその対応をしてみました。
が!!><
むー!
ファイル名は文字化けしたままでした。
●サンプルソース
protected void ButtonCSV_Click(object sender, EventArgs e)
{
string fileName = "テスト.csv";
string content = "内容";
Response.ContentType = "application/download";
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.AppendHeader("Content-Disposition", "Attachment; filename=" + fileName);
Response.Write(content);
Response.End();
}
"てすと.csv" → "縺ヲ縺吶→.csv"
"テスト.csv" → "繝・せ繝・csv"
"あ.csv" → "縺・csv"
"ああ.csv" → "縺ゅ≠.csv"
"ああああ.csv" → "縺ゅ≠縺ゅ≠.csv"
という風になります。
内容の文字コードは"Shift_JIS"ですが、ファイル名は"UTF-8"のままだと思われます。
正確な原因はわかりませんが、上記の解決方法で解決できなかったのは、
・IE9であること
が影響しているのかなぁと思いました。
そこで、別の方法で、下記のようにしたら、うまく日本語表記できました。
●サンプルソース
protected void ButtonCSV_Click(object sender, EventArgs e)
{
string fileName = "テスト.csv";
string content = "内容";
Response.ContentType = "application/download";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.AppendHeader("Content-Disposition", "Attachment; filename=" + HttpUtility.UrlEncode(fileName));
Response.Write(content);
Response.End();
}
HttpUtility.UrlEncode(fileName) がポイントですね。
CSVファイルを生成しダウンロードできるようにしたのですが、
日本語ファイル名が文字化けする!!
調べてみると、なるほど、
Microsoftが既にそうゆう事象があることを言っているんですね。
●ファイルをダウンロードする ASP.NET ページで日本語ファイル名が文字化けする
http://support.microsoft.com/kb/436616/ja
そしてその対応をしてみました。
が!!><
むー!
ファイル名は文字化けしたままでした。
●サンプルソース
protected void ButtonCSV_Click(object sender, EventArgs e)
{
string fileName = "テスト.csv";
string content = "内容";
Response.ContentType = "application/download";
Response.HeaderEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.AppendHeader("Content-Disposition", "Attachment; filename=" + fileName);
Response.Write(content);
Response.End();
}
"てすと.csv" → "縺ヲ縺吶→.csv"
"テスト.csv" → "繝・せ繝・csv"
"あ.csv" → "縺・csv"
"ああ.csv" → "縺ゅ≠.csv"
"ああああ.csv" → "縺ゅ≠縺ゅ≠.csv"
という風になります。
内容の文字コードは"Shift_JIS"ですが、ファイル名は"UTF-8"のままだと思われます。
正確な原因はわかりませんが、上記の解決方法で解決できなかったのは、
・IE9であること
が影響しているのかなぁと思いました。
そこで、別の方法で、下記のようにしたら、うまく日本語表記できました。
●サンプルソース
protected void ButtonCSV_Click(object sender, EventArgs e)
{
string fileName = "テスト.csv";
string content = "内容";
Response.ContentType = "application/download";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS");
Response.AppendHeader("Content-Disposition", "Attachment; filename=" + HttpUtility.UrlEncode(fileName));
Response.Write(content);
Response.End();
}
HttpUtility.UrlEncode(fileName) がポイントですね。
ASP.NET C# SQLServer の関連で困ったところ ~開発サーバからIISサーバ使用へ~
ASP.NETをさわってみたくて、さわってみました。
ロジック部分はC#で書きました。
SQLServerへのDB接続をしてなんかする、という単純動作です。
実際に「IIS」を利用してみようと思ったのですが、一筋縄にいかなかったので
記録しておきます。
【内容】
開発サーバからIISサーバを使用しようとした際にうまくいかなかった点の記録
【環境】
OS : Windows7 Home Premium
DB : SQL Server 2008 R2 ('Microsoft SQL Server Express Edition (64-bit))
開発 : Microsoft Visual Studio 2010 (Microsoft Visual Web Developer 2010)
まずは、IISを有効化、設定などして、
Visual Studioから、
「開始動作」は「ページを指定する」で一番初めに表示する「aspx」ファイルを記述しました。
「サーバー」は「IIS Web サーバーの使用」を選択しました。
そして緑三角ボタン(デバッグ開始)をクリックしました。
「HTTP エラー 500.21
ハンドラー "PageHandlerFactory-Integrated" のモジュール リストにあるモジュール "ManagedPipelineHandler" が正しくありません」
という訳のわからないエラーが表示されました。
調べると、ASP .NET4.0がインストールされていないだけらしいです。
使用している.NETが3.5等の場合は起きないエラーだと思います。
管理者権限コマンドプロンプトから
「C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i」
を実行してインストール完了です。
「aspnet_regiis.exe」は登録ツールです。
「-i」はインストールのオプションです。
さて、改めて緑三角ボタン(デバッグ開始)をクリックしました。
むー?><
このログインで要求されたデータベース "TosDb" を開けません。ログインに失敗しました。
ユーザー 'IIS APPPOOL\DefaultAppPool ' はログインできませんでした。
という訳のわからないエラーが表示されました。
色々調べると色々出てきすぎて、よくわかりませんでした。
これをするといい、あれをするといいetc。。。
シンプルだと思った方法を選択。
それは、エラーの内容のまんまを対応することでしたw
「Microsoft SQL Server Management Studio」から、
[DB名]-[セキュリティ]-[ユーザー]を右クリックし、「新しいユーザー」を選択します。
・「ユーザー名」「ログイン名」に「IIS APPPOOL\DefaultAppPool」を記述します。
・「データベース ロールのメンバーシップ」で「db_owner」にチェックをつけます。
・「OK」ボタンをクリックします。
最後に「IIS」の認証設定をします。
「認証」項目で、「匿名認証」を右クリックし、「編集」を選択します。
「アプリケーション プール ID」を選択し、「OK」ボタンをクリックします。
緑三角ボタン(デバッグ開始)をクリックすると正常にDB接続もできました。
※ログインできませんでしたエラーで
ユーザー 'IIS APPPOOL\ASP.NET v4.0 ' はログインできませんでした。
の時もありました。
その時も、上記同様に「そのまんま」ユーザーを追加してあげれば大丈夫でした。
ロジック部分はC#で書きました。
SQLServerへのDB接続をしてなんかする、という単純動作です。
実際に「IIS」を利用してみようと思ったのですが、一筋縄にいかなかったので
記録しておきます。
【内容】
開発サーバからIISサーバを使用しようとした際にうまくいかなかった点の記録
【環境】
OS : Windows7 Home Premium
DB : SQL Server 2008 R2 ('Microsoft SQL Server Express Edition (64-bit))
開発 : Microsoft Visual Studio 2010 (Microsoft Visual Web Developer 2010)
まずは、IISを有効化、設定などして、
Visual Studioから、
「開始動作」は「ページを指定する」で一番初めに表示する「aspx」ファイルを記述しました。
「サーバー」は「IIS Web サーバーの使用」を選択しました。
そして緑三角ボタン(デバッグ開始)をクリックしました。
「HTTP エラー 500.21
ハンドラー "PageHandlerFactory-Integrated" のモジュール リストにあるモジュール "ManagedPipelineHandler" が正しくありません」
という訳のわからないエラーが表示されました。
調べると、ASP .NET4.0がインストールされていないだけらしいです。
使用している.NETが3.5等の場合は起きないエラーだと思います。
管理者権限コマンドプロンプトから
「C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i」
を実行してインストール完了です。
「aspnet_regiis.exe」は登録ツールです。
「-i」はインストールのオプションです。
さて、改めて緑三角ボタン(デバッグ開始)をクリックしました。
むー?><
このログインで要求されたデータベース "TosDb" を開けません。ログインに失敗しました。
ユーザー 'IIS APPPOOL\DefaultAppPool ' はログインできませんでした。
という訳のわからないエラーが表示されました。
色々調べると色々出てきすぎて、よくわかりませんでした。
これをするといい、あれをするといいetc。。。
シンプルだと思った方法を選択。
それは、エラーの内容のまんまを対応することでしたw
「Microsoft SQL Server Management Studio」から、
[DB名]-[セキュリティ]-[ユーザー]を右クリックし、「新しいユーザー」を選択します。
・「ユーザー名」「ログイン名」に「IIS APPPOOL\DefaultAppPool」を記述します。
・「データベース ロールのメンバーシップ」で「db_owner」にチェックをつけます。
・「OK」ボタンをクリックします。
最後に「IIS」の認証設定をします。
「認証」項目で、「匿名認証」を右クリックし、「編集」を選択します。
「アプリケーション プール ID」を選択し、「OK」ボタンをクリックします。
緑三角ボタン(デバッグ開始)をクリックすると正常にDB接続もできました。
※ログインできませんでしたエラーで
ユーザー 'IIS APPPOOL\ASP.NET v4.0 ' はログインできませんでした。
の時もありました。
その時も、上記同様に「そのまんま」ユーザーを追加してあげれば大丈夫でした。
2013年11月11日月曜日
ASP.NET C# ~ユーザ名取得方法~
こんにちはっ!
ユーザ名を取得したい時があります。
調べてみると、
「User.Identity.Name」
で取得できるとありますが、
取得できない場合がありました。
調べてみると、
ユーザの認証方法が「フォーム」になっている場合、
上記コマンド結果は空っぽになってしまいます。
上記コマンドで取得するには、
「Web.config」ファイルの
<authentication mode="Forms">
を
<authentication mode="Windows">
に変更する。
認証方法を「フォーム」から「Windows認証」に変更したわけです。
こうすると、
「User.Identity.Name」でユーザ名が取得可能になる。
また、別の方法としては、
「Request.ServerVariables["LOGON_USER"]」
でユーザ名が取得可能です。
認証方法が「フォーム」でも、取得可能なのです。
ユーザ名を取得したい時があります。
調べてみると、
「User.Identity.Name」
で取得できるとありますが、
取得できない場合がありました。
調べてみると、
ユーザの認証方法が「フォーム」になっている場合、
上記コマンド結果は空っぽになってしまいます。
上記コマンドで取得するには、
「Web.config」ファイルの
<authentication mode="Forms">
を
<authentication mode="Windows">
に変更する。
認証方法を「フォーム」から「Windows認証」に変更したわけです。
こうすると、
「User.Identity.Name」でユーザ名が取得可能になる。
また、別の方法としては、
「Request.ServerVariables["LOGON_USER"]」
でユーザ名が取得可能です。
認証方法が「フォーム」でも、取得可能なのです。
SQLserver ~日付型の表示方法~
こんにちはっ^^
SQLserverで、datetime型を表示すると、
「2013-11-07 15:49:34.230」
になる。
表示を変更するには、
「CONVERT関数」を使用する。
・列名「create_date」(datetime型)をそのまま表示すると、
select [create_date] from TABLE;
→「2013-11-07 15:49:34.230」
・「CONVERT」関数を使用し、形式「111」を指定すると、
select CONVERT(varchar,[create_date],111) from TABLE;
→「2013/11/07」
このままだと、列名が消えてしまうので、列名を残す場合は、
select CONVERT(varchar,[create_date],111) [create_date] from TABLE;
とします。
また、形式オプションについて、色々あるのですが、
使用するのは、大概「111」か「112」だと思います。
↓↓↓ 公式ページです。
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx
SQLserverで、datetime型を表示すると、
「2013-11-07 15:49:34.230」
になる。
表示を変更するには、
「CONVERT関数」を使用する。
・列名「create_date」(datetime型)をそのまま表示すると、
select [create_date] from TABLE;
→「2013-11-07 15:49:34.230」
・「CONVERT」関数を使用し、形式「111」を指定すると、
select CONVERT(varchar,[create_date],111) from TABLE;
→「2013/11/07」
このままだと、列名が消えてしまうので、列名を残す場合は、
select CONVERT(varchar,[create_date],111) [create_date] from TABLE;
とします。
また、形式オプションについて、色々あるのですが、
使用するのは、大概「111」か「112」だと思います。
↓↓↓ 公式ページです。
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx
登録:
投稿 (Atom)