2013年11月13日水曜日

ASP.NET C# GridView 列を非表示にしてその値を参照する方法

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」列を非表示にしています。

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」は値の取得例です。


 これが一番シンプルな方法かなあと思います。

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) がポイントですね。


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 ' はログインできませんでした。

の時もありました。
その時も、上記同様に「そのまんま」ユーザーを追加してあげれば大丈夫でした。

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"]」
でユーザ名が取得可能です。

認証方法が「フォーム」でも、取得可能なのです。



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