DataGridの列幅の実行時変更方法

このQ&Aのポイント
  • DataGridの列幅を実行時に変更する方法をまとめました。
  • 実行時に条件によって列が非表示になる場合、列幅を0にする方法がわかりません。
  • JavaScriptで隠している列の値を取得できないため、列幅を0にしたいです。
回答を見る
  • ベストアンサー

DataGridの列幅を実行時に変更したい

Web画面のSpreadからDataGridへ変更する対応を行っていて、 Spreadの列幅と同じ値を以下のようにテンプレート列を使用して、 ボタンやらチェックボックスやらラベルやら配置をして設定しました。 (TemplateColumnのWidthを使用するとSpreadと同じ値をいれても1/4くらいになってしまったので。) <Columns>  <asp:TemplateColumn>   <ItemTemplate>    <asp:Button id="grdButton" runat="server" Width="45"></asp:Button>   </ItemTemplate>  </asp:TemplateColumn>  <asp:TemplateColumn>   <ItemTemplate>    <asp:Button id="grdButton1" runat="server" Width="45"></asp:Button>   </ItemTemplate>  </asp:TemplateColumn> :          : しかし、実行時に条件によって見える列が変化するため 列を非表示にしたいのですが、Visibled = Falseにしてしまうと、 JavaScriptで、隠している列の値がとれないので、Width = 0にしたいのですが、 grd.Columns(col_2).HeaderStyle.Width = New Unit(0) grd.Columns(col_2).ItemStyle.Width = New Unit(0) というように記述しても列幅が0になっていません。 上記のように実現したければ、どのような手段があるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • tochansa
  • ベストアンサー率76% (23/30)
回答No.3

あ、常に隠してる項目なんですか。それでしたら下記のような感じでHiddenなinputにデータを入れておけばjavascriptで値取得できるんじゃないかな? IDとか、隠しておきたい値を持たせるときには列じゃなくて行内に見えないコントロールを置くようにしてます。 見栄えが悪くなったりしますので。 私がやったことある仕組みではpostback時に値がとれればよかったので、visible=falseにしたlabelを置いちゃうことが多かったです。 ただ、それが一般的かどうかはちょっとわかりません。 ---html---------------------------------------------------------------- <Columns> <asp:TemplateColumn> <ItemTemplate> <div id="div1" runat="server" style="overflow:hidden;"> <asp:Button id="Button1" runat="server" Width="45px" Text='<%# bind("hoge")%>'> </asp:Button> <input id="Hidden1" runat="server" type="hidden" value='<%# bind("id")%>'/></div> </ItemTemplate> </asp:TemplateColumn> </Columns> ---ソース---------------------------------------------------------------- Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim dt As New Data.DataTable dt.Columns.Add("id") dt.Columns.Add("hoge") dt.Rows.Add(1, "hoge1") dt.Rows.Add(2, "hoge2") datagrid1.DataSource = dt datagrid1.DataBind() End Sub

kurocky
質問者

お礼

そういえば、列にこだわりすぎていましたね。 HIDDEN項目でやってみます。 回答ありがとうございました。

その他の回答 (2)

  • tochansa
  • ベストアンサー率76% (23/30)
回答No.2

初めてDataGrid触りました。列幅0pxにしてもボタン幅0pxにしてもばっちり出ちゃうんですねー。 ということで、一工夫してみました。以下、サンプルです。 ただし、ちょっと細い線が残ります。。。 ---Html部分------------------------------------------------------------------------------------------------- <asp:DataGrid ID="datagrid1" runat="server" AutoGenerateColumns="False" CellPadding="0" ShowHeader="False" > <Columns> <asp:TemplateColumn> <ItemTemplate> <div id="div1" runat="server" style="overflow:hidden;"> <asp:Button id="TextBox1" runat="server" Width="45px" Text='<%# bind("hoge")%>'> </asp:Button> </div> </ItemTemplate> </asp:TemplateColumn> <asp:TemplateColumn> <ItemTemplate> <div id="div2" runat="server" style="overflow:hidden;"> <asp:Button id="TextBox2" runat="server" Width="45px" Text='<%# bind("huga")%>'> </asp:Button> </div> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:DataGrid> <asp:Button ID="Button1" runat="server" Text="Button" /> <asp:Button ID="Button2" runat="server" Text="Button" /> ---サーバー側------------------------------------------------------------------------------------------------- Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim dt As New Data.DataTable dt.Columns.Add("hoge") dt.Columns.Add("huga") dt.Rows.Add("hoge1", "huga1") dt.Rows.Add("hoge2", "huga2") datagrid1.DataSource = dt datagrid1.DataBind() End Sub Protected Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim div As HtmlControl For i As Integer = 0 To Me.datagrid1.Items.Count - 1 div = Me.datagrid1.Items(i).FindControl("div1") div.Style.Item("width") = "0px" div = Me.datagrid1.Items(i).FindControl("div2") div.Style.Item("width") = "45px" Next End Sub Protected Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim div As HtmlControl For i As Integer = 0 To Me.datagrid1.Items.Count - 1 div = Me.datagrid1.Items(i).FindControl("div1") div.Style.Item("width") = "45px" div = Me.datagrid1.Items(i).FindControl("div2") div.Style.Item("width") = "0px" Next End Sub // HiddenFieldなんて便利そうなものがあるんですね!折角作ってみたので投稿しちゃったけど、 そっちのほうがいいかも。。

kurocky
質問者

お礼

回答ありがとうございます。 そうなんです。ばっちりでちゃうのです。 結局細かく仕様を突き詰めれば、JavaScriptで取得したいのは、 条件によって切り替わる列ではなくて、常に隠している項目のようでした。 切り替わる列はVisibledでいけそうです。 でも、常に隠している項目についても、Visibledではアクセスできないので、 tochansaさんのコントロールをDIVで囲む?も試してみます。 そもそもWebコントロールに隠し列を持つなんて概念がおかしいのでしょうか(^^;)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

次のようなのはどうでしょうか。 隠したいカラムをTemplateFieldにし、itemのところにHiddenFieldを追加し、それにBindingをしてあげては。 ただ、動的にどのカラムが非表示になるかが変わるとなるともうちょっとひねりが必要かもしれませんが。

kurocky
質問者

お礼

回答ありがとうございます。 TemplateFieldやHiddenFieldを探してみましたが、 どうやらDataGridではなく、GridViewみたいですね。 システムのバージョンで、GridViewは使えないのです。 情報が足りなくてすいません。

関連するQ&A

  • gridviewの中のCSSを変更したい

    画面にチェックボックスがあります。 チェックボックスを Trueにした時、gridviewのaタグを有効にし、Falseにした時、無効にしたいと思っています。 vb側のチェックボックスを変更した時に、どのように記述すればよいでしょうか? できなければ、Falseの時に、aタグのclassを空白にしてもいいかなと思っています。 どなたかご教授ください。 <div id="containerData" class="containerData" onscroll="containerHeader.scrollLeft=this.scrollLeft;" runat="server"> <asp:GridView ID="grdList" runat="server" AutoGenerateColumns="False" DataSourceID="sqldsList" CssClass="List" DataKeyNames="NO" SelectionMode="None" CellPadding="0" CellSpacing="0" GridLines="None" > <Columns> <asp:TemplateField HeaderText="番号"> <ItemTemplate> <a class="tooltip" title='<%# Eval("NO") %>'> <custom:textLabel ID="lblNo" CssClass="No detailRow" runat="server" Text='<%# Eval("NO") %>' /> </a> </ItemTemplate> <ItemStyle CssClass="rowStyle"></ItemStyle> </asp:TemplateField> <asp:TemplateField HeaderText="名前"> <ItemTemplate> <a class="tooltip" title='<%# Eval("NAME") %>'> <custom:textLabel ID="lblName" CssClass="Name detailRow" runat="server" Text='<%# Eval("NAME") %>' /> </a> </ItemTemplate> <ItemStyle CssClass="rowStyle"></ItemStyle> </asp:TemplateField> </Columns> </asp:GridView> </ContentTemplate> </div>

  • C# ListView 自作列幅調整 描画されない

    いつもお世話になっております。 今回はC#のListViewで皆様にお聞きしたいことがあり、 質問させて頂きました。 ListViewに3列追加しListViewの幅が変更された際に 2列目のみを引き延ばすものを作りたいと思っています。 しかし、以下操作を行うと、ListViewのリサイズ等で 描画更新されない状態になってしまいます。 (また、リストアイテムをクリックするとその列は描画されるのですが、 アイテムの描画開始Y位置がおかしくなっています。)  1.縦スクロールバーが表示されるまで縮小する  2.スクロールバーのノブを下に移動  3.縦スクロールバーの表示が消えるまで拡大する サンプルコード及び画像を添付いたします。 内容は、  3列のListViewに適当なアイテムを10個追加し、  OnClientSizeChangedでClientSize.Widthと1列3列の幅から  2列目の幅を算出・設定しています。 ※画像は、以下コントロールをFormに張り付けただけのもので  問題の起こる操作をした際のものになります。 class MyListView : ListView {   public const int COL_1_WIDTH  = 30;   public const int COL_3_WIDTH  = 75;   enum LISTVIEW_COL   {     COL1,     COL2,     COL3,     NUM   }   public MyListView() {     Dock = DockStyle.Fill;     HeaderStyle = ColumnHeaderStyle.None;     FullRowSelect = true;     HideSelection = false;     View = System.Windows.Forms.View.Details;     //ヘッダ追加     ColumnHeader column1 = new ColumnHeader();     ColumnHeader column2 = new ColumnHeader();     ColumnHeader column3 = new ColumnHeader();     ColumnHeader[] columnHeaders = { column1, column2, column3 };     this.Columns.AddRange( columnHeaders );     //ヘッダ幅追加     this.Columns[( int )LISTVIEW_COL.COL1].Width = COL_1_WIDTH;  //1列固定     this.Columns[( int )LISTVIEW_COL.COL3].Width = COL_3_WIDTH; //3列固定     int width = ClientRectangle.Width;     for( int i = 0; i < Columns.Count; i++ ) {       if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }       width -= Columns[i].Width;     }     //2列 リストビューの幅いっぱいになるように調節     this.Columns[( int )LISTVIEW_COL.COL2].Width = width;     //適当にアイテム追加     for( int i = 0; i < 10; i++ ) {       string[] strs = { "COL1", "COL2", "COL3" };       ListViewItem item = new ListViewItem( strs );       this.Items.Add( item );     }   }   protected override void OnClientSizeChanged( EventArgs e ) {     base.OnClientSizeChanged( e );     //2列の幅を調整     int width = ClientRectangle.Width;     for( int i = 0; i < Columns.Count; i++ ) {       if( i == ( int )LISTVIEW_COL.COL2 ) { continue; }       width -= Columns[i].Width;     }     Columns[( int )LISTVIEW_COL.COL2].Width = width;   } } 何故このようになってしまうのかご存知の方いらっしゃいましたら教えてください。

  • データグリッド内に配置したテキストボックスの幅調整

    初めまして。 vb.net初心者(開発経験2週間)です。 データグリッド内のテキストボックスにDBから取得してきた値を テキストボックスに表示させるところまではできたのですが そのテキストボックスを取得してきた値に合わせて 幅を調整したいのですが直接widthを指定しても幅が 変わってくれません。 どなたかご教授いただけませんでしょうか? よろしくお願いいたします。 現在以下のようにソースコードを考えています。 <asp:datagrid id="MyDataGrid" style="Z-INDEX: 105; LEFT: 0px; POSITION: absolute; TOP: 88px" runat="server" BackColor="#FFE0C0" Height="30px" Width="300px" ForeColor="Black" BorderColor="Black" BorderStyle="Solid" AutoGenerateColumns="False" HorizontalAlign="Center"> <Columns> <asp:TemplateColumn HeaderText="DBカラム名"> <HeaderStyle Wrap="False" HorizontalAlign="Center" VerticalAlign="Middle"> </HeaderStyle> <ItemTemplate> <asp:TextBox Runat="server" ID="txt1" Text='<%# DBから値を取得 %>'> </asp:TextBox> </ItemTemplate> </asp:TemplateColumn> </Columns> </asp:datagrid>

  • テーブルの列幅を固定にしたい

    お世話になります。テーブルの列幅を固定にしたいのですが、どうも上手くいきません。 それぞれの列幅をwidthで設定すると、空白の列は(正確には全角スペースが入っている列は)正しい列幅で表示されるのですが、列幅より長い文言が入っている列は、列幅が狭くなってしまいます。・・・逆だとまだマシなんですけど; 私の希望としては、列幅は完全固定にして、列幅より長い文言がセルに入った場合は、行幅を広げて表示して欲しいんです。 試しに値を消したときは正しい列幅で表示されて、長い文言を入れたとたん狭くなります(T.T) HTMLの仕様なのでしょうか?

    • ベストアンサー
    • HTML
  • ボタンの配置

    初心者の問題ですが。。 ページの中央にボタン配置したいときはどのタグ使うでしょうか。 <asp:Button id="cmdSubmit" style="Z-INDEX: 105; LEFT: 100px; POSITION: absolute; TOP: 400px"runat="server" Text="送信" Width="128px"></asp:Button> <asp:Button id="cmdCancel" style="Z-INDEX: 106; LEFT: 350px; POSITION: absolute; TOP: 400px"runat="server" Text="キャンセル" Width="128px"></asp:Button> LEFTのところcenterに変えてみたんですがだめでした。。。 教えてください。 よろしくお願いします。

  • aspxでIFみたいなことがしたい

    aspxファイルで、以下のようにデータリストを使用しています。 <asp:DataList ID="datalistBiographies" runat="server" RepeatDirection="Horizontal" Width="100%"> <ItemTemplate> <p> <a href='BiographyInfo.aspx?id=<%# Eval("BiographyID") %>'>View Biography</a><br /> <a id="lnkProjects" href='<%#Eval("ProjectPicture") %>'>Submitted Projects</a> </p> </ItemTemplate> </asp:DataList> ここで、ProjectPictureの値が空文字列のときにこの<a>タグを表示したくないのですが、ASPのときは以下のようにしましたがASP.Netではどのようにすればいいでしょうか? <% If (Not Len(ProjectPicture) > 0) Then %> <a id="lnkProjects" href='<%#Eval("ProjectPicture") %>'>Submitted Projects</a> <% End If %> 基本的なことですみませんがよろしくお願いします。検索の仕方が悪いのか自分で調べることができませんでした。

  • ASP.NET WEBアプリケーションで作成されたページより他の既存ペ

    ASP.NET WEBアプリケーションで作成されたページより他の既存ページへデータを投げたいと考えているのですがセキュリティ上難しいのでは?と考えています。しかし、なんとか代替案がないかと思っておりどなたかヒントをいただけないでしょうか? <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> <asp:TextBox ID="TextBox3" runat="server" Height="72px" TextMode="MultiLine" Width="651px"></asp:TextBox> <br /> <asp:Button ID="Button1" runat="server" Text="Button" />&nbsp;&nbsp; <asp:Button ID="Button2" runat="server" Text="Button" /> <br /> <br /> <asp:Label ID="Label1" runat="server"></asp:Label> 例えばこんな簡単なaspxのページで構成されているとします。 テキストボックスに入れた値を既存のWEBページ(Yahooへのログインだとか)へ入れ込みたいのですが・・・クライアントにスクリプトで作ってとかなら余裕で出来ると思うのですがサーバサイドで仕込むことは難しいでしょうか?回避策とかもあるとなおうれしいのですが・・・よろしくお願いします。

  • GridView でコンボボックスの設定

    再質問をさせていただきます。 gridviewを作成しました。 -------------------------------------------------------------------------------- <asp:GridView ID="grdList" runat="server" DataSourceID="sqldsList"> <Columns> <asp:BoundField DataField="ITEMNO" HeaderText="ITEMNO"></asp:BoundField> <asp:TextBox ID="txtNAME" runat="server" Text='<%# Bind("ITEM_NAME") %>'></asp:TextBox> <ItemTemplate>   <asp:DropDownList CssClass="cnbstr" ID="cnb_KBN" runat="server"     DataSourceID="sqldscnb1" DataTextField="NAME" DataValueField="NO" AutoPostBack="True"></asp:DropDownList> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> -------------------------------------------------------------------------------- このコンボボックスに値を設定させたいのですが、ITEMNO="01"の時だけ、txtNAMEの値を初期表示したいと思っています。 RowDataBound、RowCreatedで可能かと思ったのですができずに困っています。 どなたかご教授お願いします。 Protected Sub grdList_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdList.RowDataBound   If e.Row.RowType = DataControlRowType.DataRow Then     IF DataBinder.Eval(e.Row.DataItem, "ITEMNO").ToString() = "01" THEN       Dim dlist As DropDownList = DirectCast(e.Row.FindControl("cnb_KBN"), DropDownList)       dlist.SelectedValue = "ITEM_NAME" ←こんな感じのことをしたい     ELSE       設定しない     END IF   End If End Sub

  • ASP.NETで質問です。

    ASP.NETで質問です。 <asp:Repeater ID="rp" runat="server" OnItemDataBound="rp_OnItemDataBound"> <ItemTemplate> <asp:Literal ID="ltr_num" runat="server" /> <asp:Literal ID="ltr_name" runat="server" /> <br /> </ItemTemplate> </asp:Repeater> rp_OnItemDataBoundメソッドでltr_num,ltr_nameに値を入れたいのですが、 ltr_num.Text,ltr_name.Textにアクセスできません。 どなたか教えてください。 お願い致します。

  • ASP

    ASPのNETのButtonコントロールについて for文で <asp:Button ID="Button3" runat="server" onclick="SubmitBtn_Click" Text="注文する" Width="110px"/> を繰り返して複数個のボタンを作ったのですがそれぞれ個別した動作を設定できずどのボタンを押しても同じ動きしかしてくれません。なんとか別々に動作を決定することはできないんでしょうか?