- PR -

DataGridのハイパーリンク列に行位置を入れたい

投稿者投稿内容
たんく
会議室デビュー日: 2003/04/14
投稿数: 8
投稿日時: 2003-04-14 20:07
はじめまして、たんくと申します。

DataGridを利用した一覧画面のハイパーリンク列のurl値に、画面上の行位置を
埋め込みたいのですが、プロパティービルダだけ(HTMLやコード画面の編集は
 行わない)を利用して指定する為には、どうしたら良いのでしょうか?

 <例> ブラウザ側で受け取ったHTMLイメージ
<tr><td><a href="abc.aspx?id="1">...</a></td><td>...</td></tr>
<tr><td><a href="abc.aspx?id="2">...</a></td><td>...</td></tr>
<tr><td><a href="abc.aspx?id="3">...</a></td><td>...</td></tr>
     :

 ※ 1行目から順にid値がカウントアップされている状態
   pagingにより一覧の内容が変わっても、常に上の例の様に表示させたい

お手数をおかけいたしますが、お知恵を拝借させて頂きたく、よろしくお願いいたします。
いし
常連さん
会議室デビュー日: 2003/04/15
投稿数: 27
投稿日時: 2003-04-15 04:27
ItemCommandで処理するというのはダメでしょうか?
たんく
会議室デビュー日: 2003/04/14
投稿数: 8
投稿日時: 2003-04-15 09:34
いしさん、ありがとうございます。
ItemCommand調べてみました。

この場合、ハイパーリンクは止めて、元ページで一度イベントを受け取ってから、Redirectすると云う様なイメージになるのでしょうか。
それでも良いですね。(今回はそっちの方が良いような気がします)

もし、行番号を埋める方法がありましたら、参考までにコメントいただけると嬉しいです。
宜しくお願いいたします。
いし
常連さん
会議室デビュー日: 2003/04/15
投稿数: 27
投稿日時: 2003-04-15 10:57
こんな感じでいかがでしょうか?
ページングされたときにどうなるかは試していませんが・・・。

コード:

<asp:TemplateColumn HeaderText="sample">
	<ItemTemplate>
		<asp:HyperLink runat="server" Text="link" NavigateUrl='<%# "link.aspx?id=" + Container.ItemIndex %>' />
	</ItemTemplate>
</asp:TemplateColumn>


テンプレート化する必要があるのかとか、そういう細かいことは考えていません(^^;。
たんく
会議室デビュー日: 2003/04/14
投稿数: 8
投稿日時: 2003-04-15 14:10
ざっ、挫折しました。
それはさておき...

いしさんの提案はばっちりでした。
Pagingしてもちゃんと表示されます。
ありがとうございました。

ただ、難点としてプロパティビルダでは、このタグを自動的に生成させる事が
出来ない(と云うか私は出来ませんでした)と云うところにあります。
結局、HTMLページにして編集作業を行うと云った操作が必要でした。

この作業の中で分かった事は...
1.ButtonColumnの人は、テンプレート列に変換しても指定した内容が残る
2.HyperLinkColumnの人は、テンプレート列に変換したら、指定内容は全て消える
 ->また、いしさんのアドバイスでは「HyperLink」ですのでPBからの指定は
  出来ませんでした
 ->ついでに、HyperLinkColumnでは<%#...%>を指定するとDataBindingがどうした
  こうしたと云う実行時エラーが出ました
  すみません、良く分かってないのでこれに関しては別途調べます

と云う、動作上の違いでした。
何故でしょうか? 困ったもんです。

で、脇に置いといた挫折の理由ですが、以下の通りです。
1.今回はリンク先を別ウィンドウに表示したかった
 ->HyperLinkでなければ実現できない(ItemCommandではちょっと無理でした)
2.よーーく考えたら(え!?そんなの当たり前?)、元質問の様にurlが生成されると
 どのページに移動しても、見た覚えのない行が「表示済み」の色になってしまう

以上です。
いしさん、どうもありがとうございました。
また、くだらない質問でお目に掛かる事もあるかも知れませんが、皆様宜しくお願いいたします。
いし
常連さん
会議室デビュー日: 2003/04/15
投稿数: 27
投稿日時: 2003-04-15 14:55
あっ、プロパティビルダだけで、ってことでしたね。失礼しました。

行番号ってことではなくて、データ中の特定のカラムの値などでし
たらプロパティビルダでできると思います。逆にデータソース側で
行番号のようなものを生成してしまったほうが話が早いかもしれま
せん。普通は行番号ではなくてIDなんかを使いますけどね。

リンク先を別ウィンドウにってことですが、いろいろやればできる
気がしますね。ちょっと考えている時間がないのですが、Attributes
などをいじったりすればできないかな・・・。

そもそも、なぜに「プロパティビルダだけ」ってことなのか、よく
分からないのですが(^^;。

あと、URLの色ですが、スタイル等で指定すればどうにでもなりませ
んか?
たんく
会議室デビュー日: 2003/04/14
投稿数: 8
投稿日時: 2003-04-15 17:21
はい!
補足します。

仰せの通り、urlの色は何とでもなります。
何とかしないのは、私が面倒くさがりだからです。 申し訳ない。

別ウィンドウに関しては、クライアントサイドのscriptとか使えば何とかなるし、
その様なコンポーネントを作成されている方もいらっしゃいますね。

プロパティビルダだけで ってのは、一つには私のこだわりかな。
HTML知らない人が(VS使うとも思えませんけど)グラフィカルな画面の定義だけで
APが作れるんだー と云う状況がどこまで実現できるのかを探っている状態です。

だから、DBアクセスするのも基本的にはデータアクセス系のコントロールをD&Dで
持ってくるやり方で、どこまで出来るのかとか...
(...Adapterをコードでインスタンス化するなんて以ての外! と云う立場)

いや、別にコーディングを否定している訳ではないですよ。
.NETの限界を(って大きく出たな)知りたいなぁ、とかね思っている訳です。

で、どこら辺まで出来るのかが見極められれば、次の目標はそういうお助け機能を
持ったコントロールを作成して、デザイナーとの相性はどうよ? と云った辺りを
探って行きたいなぁ、なんて。

でも、結構色々出来るんで満足してます。(今のところは)
でゎ、今後とも宜しくお願いいたします。

[ メッセージ編集済み 編集者: たんく3 編集日時 2003-04-16 14:55 ]

[ メッセージ編集済み 編集者: たんく3 編集日時 2003-04-16 14:56 ]
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2003-04-16 01:48
こんばんわ。
ZEBRAです。

プロパティビルダだけ(テンプレート列編集も含む?)でどこまでできるかってことですが、私なりに考えてみました。
以下のように実装すると、スクリプトを使わずに別ウィンドウ表を表示することが可能になります。
但し、行番号取得の処理については、GUIだけでカバーするのは(私が考えた限りでは…)かなり複雑になると判断し、コードビハインド側に関数を記述しました。

【実装の内容】
まず、以下のコードをaspx側に作成する。(ってありますが、実際はプロパティビルダと「テンプレート列編集」のみで記述できます)
<Columns>
 <asp:TemplateColumn>
  <ItemTemplate>
<asp:HyperLink id=HyperLink1 runat="server" Width="111px" NavigateUrl="<%# this.GetItemNumber(Container) %>" Target="_blank">HyperLink</asp:HyperLink>
  </ItemTemplate>
 </asp:TemplateColumn>
</Columns>

さらに、コードビハインド(aspx.cs)で、以下のコードを記述する。
(ここは手で書いてください。)

 protected int GetItemNumber(DataGridItem item)
 {
  DataGrid dg = (DataGrid)item.Parent.Parent;
  int currentPage = dg.CurrentPageIndex;
  int size = dg.PageSize;
  int index = item.ItemIndex;

  return index + size * currentPage;
 }

(これ↓はイベントの処理なので、データグリッドのイベントプロシージャを作成してから実装して下さい。)

 private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
 {
  DataGrid dg = (DataGrid)source;
  dg.CurrentPageIndex = e.NewPageIndex;
  dg.DataBind();
 }

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