C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: ファイルの存在有無により処理を変えたい


(過去ログ 104 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■62142 / inTopicNo.1)  ファイルの存在有無により処理を変えたい
  
□投稿者/ はむ (1回)-(2011/09/24(Sat) 13:19:46)

分類:[ASP.NET (VB)] 

はじめまして。はむと申します。
サーバにファイルを置いてDatagridからそのファイルにリンクを張る処理を作成しています。

その処理のなかでファイルが存在しない場合は、当該セルを空文字にし
存在する場合は、リンクを貼り『確認』と表示させる処理を作ろうと思い
いろいろ試したのですが、うまくいかず今にいたっています。
どのように処理すればよいかご教授願います。

また勉強中の身なのでこのようにやった方がよいのでは?という
ご指摘もいただければ幸いです。

以下、ソースになります。

-----------------------
    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)Handles DataGrid1.ItemDataBound
        Dim folderpath As String = "c:\hoge\"	'フォルダ文字列
        Dim filepath As String	'ファイルパスを格納
        Dim i As Integer	'行をカウント
        


        For i = 0 To dt.Rows.Count - 1

            filepath = folderpath & dt.Rows(i)("会社CD") & ".pdf" 'ファイルパスをいれる

            If File.Exists(filepath) Then	'ファイルは存在する
                
                'ファイルが存在する場合、DataGridのB列(ハイパーリンク列)にfilepathのリンクを貼り確認と表示
                'テンプレート列じゃないと無理?

		'DataGrid1.Items(i).Cells(1).Text() = "確認"と書くと
		'ArgumentOutOfRangeException:Index was out of rangeというエラーが出て進めません。

		'e.Item.Cells(1).Text = "確認"だと全て『確認』になりリンクも解除されてしまいました。
                
                
            Else	'ファイルは存在しない
            	
            	'DataGridのB列に空文字を表示
                
            End If
        Next

    End Sub
-------------------------

以上、よろしくお願いします。

引用返信 編集キー/
■62143 / inTopicNo.2)  Re[1]: ファイルの存在有無により処理を変えたい
□投稿者/ shu (1010回)-(2011/09/24(Sat) 13:59:59)
2011/09/24(Sat) 14:00:29 編集(投稿者)

No62142 (はむ さん) に返信

> 'ArgumentOutOfRangeException:Index was out of rangeというエラーが出て進めません。
>
> 'e.Item.Cells(1).Text = "確認"だと全て『確認』になりリンクも解除されてしまいました。

e.Item.Cells(1).NavigateUrl = "リンク先"
でどうでしょう?
引用返信 編集キー/
■62164 / inTopicNo.3)  Re[2]: ファイルの存在有無により処理を変えたい
□投稿者/ はむ (2回)-(2011/09/26(Mon) 10:19:33)
shu様、ご回答ありがとうございます。
> e.Item.Cells(1).NavigateUrl = "リンク先"
> でどうでしょう?

NavigateUrlはSystem.Web.UI.WebControls.TableCellのメンバではありません。
とでました。

色々調べてHyperLinkColumn(hlcとつけました)オブジェクトを作成しては?
思いやってみましたがやはり列全体に適用されてダメでした。


&#160;&#160;&#160;&#160;&#160;&#160;&#160;'---ファイルが存在する場合
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.Text&#160;=&#160;"確認"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.DataNavigateUrlField&#160;=&#160;"会社CD"
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.NavigateUrl&#160;=&#160;"{0}.pdf"

&#160;&#160;&#160;&#160;&#160;&#160;&#160;'---ファイルが存在しない場合
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.Text&#160;=&#160;""
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.DataNavigateUrlField&#160;=&#160;""
&#160;&#160;&#160;&#160;&#160;&#160;&#160;hlc.NavigateUrl&#160;=&#160;""

そもそもなぜ行ごとに処理されない。。。
IF分で分岐されているのは確認しております。。
根本的に勘違いしていると思うのですが、そこが分かりません。


あと環境を記載したつもりでしたが記載しておりませんでした。
申し訳ありません。

環境:ASP.NET1.1&#160;VS2002

以上、よろしくお願いいたします。

引用返信 編集キー/
■62165 / inTopicNo.4)  Re[3]: ファイルの存在有無により処理を変えたい
□投稿者/ shu (1011回)-(2011/09/26(Mon) 11:06:50)
No62164 (はむ さん) に返信
> shu様、ご回答ありがとうございます。
>>e.Item.Cells(1).NavigateUrl = "リンク先"
>>でどうでしょう?
>
> NavigateUrlはSystem.Web.UI.WebControls.TableCellのメンバではありません。
> とでました。

失礼しました。勘違いしていたようです。

http://www.atmarkit.co.jp/fdotnet/dotnettips/067linksdg/linksdg.html
を参考にすると出来るかもしれません。
引用返信 編集キー/
■62171 / inTopicNo.5)  Re[4]: ファイルの存在有無により処理を変えたい
□投稿者/ はむ (3回)-(2011/09/26(Mon) 16:41:17)
shu様、たびたび回答いただいてありがとうございます。
リンク先を参照し、テンプレート列にて処理してみました。
とりあえずテキストだけの変更をテストしてみましたが、やはり最後に処理されたデータが
列全体に反映されます。。(以下の例だと全て"ng"となる)

ただ一歩前進したのは、テキストのみが変更され、リンクは解除されなくなりました!
あとはファイルの存在有無で行ごとに処理してくれればいいのですが。

ループ処理の中に入れているからなのでしょうか?


-----------------------

    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)Handles DataGrid1.ItemDataBound
        Dim folderpath As String = "c:\hoge\"	'フォルダ文字列
        Dim filepath As String	'ファイルパスを格納
        Dim i As Integer	'行をカウント
        Dim hl As New HyperLink()
        
		
	hl = e.Item.FindControl("HyperLink1")
		
    If Not hl Is Nothing Then

        For i = 0 To dt.Rows.Count - 1

            filepath = folderpath & dt.Rows(i)("会社CD") & ".pdf" 'ファイルパスをいれる

            If File.Exists(filepath) Then	'ファイルは存在する
                
                hl.Text = "ok"
                
                
                'ファイルが存在する場合、DataGridのB列(ハイパーリンク列)にfilepathのリンクを貼り確認と表示
                'テンプレート列じゃないと無理?

		'DataGrid1.Items(i).Cells(1).Text() = "確認"と書くと
		'ArgumentOutOfRangeException:Index was out of rangeというエラーが出て進めません。

		'e.Item.Cells(1).Text = "確認"だと全て『確認』になりリンクも解除されてしまいました。
                
                
            Else	'ファイルは存在しない
            
            	hl.Text = "ng"

            	'DataGridのB列に空文字を表示
                
            End If
        Next
        
    End If

    End Sub

-------------------------

以上、よろしくお願いします。


■No62165 (shu さん) に返信
> ■No62164 (はむ さん) に返信
>>shu様、ご回答ありがとうございます。
> >>e.Item.Cells(1).NavigateUrl = "リンク先"
> >>でどうでしょう?
>>
>>NavigateUrlはSystem.Web.UI.WebControls.TableCellのメンバではありません。
>>とでました。
> 
> 失礼しました。勘違いしていたようです。
> 
> http://www.atmarkit.co.jp/fdotnet/dotnettips/067linksdg/linksdg.html
> を参考にすると出来るかもしれません。

引用返信 編集キー/
■62200 / inTopicNo.6)  Re[5]: ファイルの存在有無により処理を変えたい
□投稿者/ はむ (4回)-(2011/09/28(Wed) 02:02:05)
はむです。
その後テンプレート列を調べ色々試してみましたが、やはり行ごとに処理をわけることはできませんでした。
やり方を変えてみようと思い、Datagridのセルを指定してそのテキストを変更してみようと試しているのですが
★の箇所で以下のエラーがでます。

[ArgumentOutOfRangeException: Index was out of range.  Must be non-negative and less than the size of the collection.
Parameter name: index]

調べた所、インデックスが範囲外というエラーということがわかり
範囲外のインデックスを指定した場合やコレクション(インスタンス?)などが生成されていない時に出るものだと言うことまで分かりました。
ステップで実行し、i=0で止まるのでインデックスが理由ではないと思っています。

後者の理由だと思いますが、自分でも調べて試してみたつもりですが、結局解消されずどのように対応してよいか分からず悩んでいます。
どのように対応するべきなのか、識者の方ご教授いただけますようお願いします。
(件名と内容が離れて初めているので別のトピックスにした方がよいだろうか。。)

以上、よろしくお願いいたします。


    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs)Handles DataGrid1.ItemDataBound
        Dim folderpath As String = "c:\hoge\"	'フォルダ文字列
        Dim filepath As String	'ファイルパスを格納
        Dim i As Integer	'行をカウント
        Dim ditem As DataGridItemCollection

      ditem = DataGrid1.Items

        For i = 0 To dt.Rows.Count - 1

            filepath = folderpath & dt.Rows(i)("会社CD") & ".pdf" 'ファイルパスをいれる

            If File.Exists(chk_kyotei) Then
                ditem.Item(i).Cells(1).Text = "確認"  '-----------★

                'filePathのファイルは存在する
                'DataGrid1.Items(i).Cells(1).Text() = "確認"


            Else
                ditem.Item(i).Cells(1).Text = ""  '------------★

                'filePathのファイルは存在しない

                'e.Item.ForeColor = Color.FromName("blue")

            End If
   End SUb

引用返信 編集キー/
■62201 / inTopicNo.7)  Re[6]: ファイルの存在有無により処理を変えたい
□投稿者/ shu (1017回)-(2011/09/28(Wed) 07:17:57)
No62200 (はむ さん) に返信

提示したリンク先の

NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "id", "result.aspx?target={0}") %>

この辺かなと思ったんですが駄目でしたか?
引用返信 編集キー/
■62231 / inTopicNo.8)  Re[7]: ファイルの存在有無により処理を変えたい
□投稿者/ はむ (5回)-(2011/09/29(Thu) 01:37:41)
No62201 (shu さん) に返信
> NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "id", "result.aspx?target={0}") %>
> 
> この辺かなと思ったんですが駄目でしたか?
はむです。
返信ありがとうございます。

教えていただいたリンク先の情報やDataBinder.Evalの関連情報を元にItemTemplateに設定してみた(Text=〜の箇所)のですが
SqlException: SQL Server does not exist or access denied.というエラーで先に進めず断念してしまいました。
この箇所の記述の仕方は色々あるようで、一通り試したのですがすべてエラーで動きませんでした。元のText="確認"とすると動きます。

ちなみに『NavigateUrl=〜』の部分はハイパーリンク列からテンプレート列に変更した債に、自動変換されたものです。
あたりまですがこちらは上手く動きます。
そちらの記述と同様(hogeinfo以降は抜かして)に記述しても、Textでは動きませんでした。。
他の方法も模索しつつ明日またチャレンジしてみます。

記述方法に間違いがございましたらご指摘ください。



<asp:TemplateColumn HeaderText="書類情報">
	<ItemTemplate>
		<asp:HyperLink runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "会社名") %>' NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.会社CD", "hogeinfo/ha/kyotei/{0}.pdf") %>'>
		</asp:HyperLink>	      
	</ItemTemplate>
</asp:TemplateColumn>

引用返信 編集キー/
■62266 / inTopicNo.9)  Re[8]: ファイルの存在有無により処理を変えたい
□投稿者/ はむ (6回)-(2011/09/30(Fri) 00:20:09)
はむです。

> 教えていただいたリンク先の情報やDataBinder.Evalの関連情報を元にItemTemplateに設定してみた(Text=〜の箇所)のですが
> SqlException: SQL Server does not exist or access denied.というエラーで先に進めず断念してしまいました。
このエラーですがサーバが丁度お亡くなりになったようで、そのためこのようなエラーが出たようです。
DataBinder.Eval〜に関しては動作しました!
その後試行錯誤しながら色々やりましたが行単位の処理はやはりできていない状況です。

件名とやりたいことが余りにもかけ離れてしまったため、一度締めさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -