QA@IT

GRIDVIEWの列幅を変更したら、想定外の幅となってしまう(ASP.NET/VS2010)

9997 PV

いつもお世話になっております。

開発環境:VS2010(ASP.NET/C#、.NETFramework4.0)

GRIDVIEWを使用し、特定の列に対してラジオボタンの選択により列の表示非表示と列幅の設定を行おうとしています。
列の表示非表示は問題ないのですが、列幅を指定してもどうしても同じサイズ(1文字分)になってしまいます。

設定は下記2タイプで実施しました。
パターン1
this.GridView1.Columns[6].ItemStyle.Width = 400;
パターン2
foreach (GridViewRow gvr in GridView1.Rows)
{
  gvr.Cells[6].Width = 400;
}

Widthに設定してる400を変更したりもしましたが結果は全て同じでした。
Gridviewの各列に対してはwrap=falseも設定しています。

どのように設定したら、指定文字数分だけの表示ができるようになりますか?

  • 基本、パターンⅠのやり方でできるはずです。
    しいて言うなら、スタイル等の変更はGridviewのPreRenderイベントあたりでやるのが無難かと思われます
    -
  • こんにちは。元々、選択用のRadioButtonListのイベントで実施してましたが、PreRenderに置き換えてみました。ですが、やはり数値をどれだけ変更しても同じサイズにしかなりません。 -
  • http://surferonwww.info/BlogEngine/post/2011/04/30/Freezing-GridView-header-and-column.aspx のサンプルコードの GridView1_PreRender ハンドラのような感じでできませんか? -

回答

コメントしておいてできないと何なので、以下のコードで検証してみました。Web サイトプロジェクトならコピペすれば動くはずなので試してみてください。(Web アプリケーションプロジェクトでもコード部を分ければ動くはずです)

これがやりたいことと違う場合は、何処がどのように違うか詳しく書いてください。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    // GridView に表示する DataTable の生成
    DataTable CreateDataTable()
    {
        DataTable dt = new DataTable();
        DataRow dr;

        dt.Columns.Add(new DataColumn("Code", typeof(Int32)));
        dt.Columns.Add(new DataColumn("Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Price", typeof(Int32)));
        dt.Columns.Add(new DataColumn("Qty", typeof(Int32)));
        dt.Columns.Add(new DataColumn("Amount", typeof(Int32)));
        dt.Columns.Add(new DataColumn("Remarks", typeof(string)));

        for (int i = 0; i < 15; i++)
        {
            dr = dt.NewRow();
            dr["Code"] = i;
            dr["Name"] = "Item " + i.ToString();
            dr["Price"] = 123000 * (i + 1);
            dr["Qty"] = i + 1;
            dr["Amount"] = 123000 * (i + 1) * (i + 1);
            dr["Remarks"] = "あおいえおかきくけこさしすせそたちつてと-" + i.ToString("D2");
            dt.Rows.Add(dr);
        }
        return dt;
    }

    void Page_Load(Object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = CreateDataTable();
            GridView1.DataBind();
        }
    }

    protected void GridView1_PreRender(object sender, EventArgs e)
    {
        foreach (GridViewRow row in GridView1.Controls[0].Controls)
        {
            if (row.RowType == DataControlRowType.Header)
            {
                if (RadioButtonList1.SelectedValue == "1")
                {
                    row.Cells[5].Style.Clear();
                } 
                else if (RadioButtonList1.SelectedValue == "2")
                {
                    row.Cells[5].Style.Clear();
                    row.Cells[5].Style["width"] = "25em;";
                }
                else if (RadioButtonList1.SelectedValue == "3")
                {
                    row.Cells[5].Style.Clear();
                    row.Cells[5].Style["display"] = "none;";
                }
            }
            else if (row.RowType == DataControlRowType.DataRow)
            {
                if (RadioButtonList1.SelectedValue == "1")
                {
                    row.Cells[5].Style.Clear();
                }
                else if (RadioButtonList1.SelectedValue == "2")
                {
                    row.Cells[5].Style.Clear();
                    row.Cells[5].Style["width"] = "25em;";
                }
                else if (RadioButtonList1.SelectedValue == "3")
                {
                    row.Cells[5].Style.Clear();
                    row.Cells[5].Style["display"] = "none;";
                }
            }
            else if (row.RowType == DataControlRowType.Footer)
            {
                // 今回、フッターはないので何もしない。
            }
        }
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:RadioButtonList ID="RadioButtonList1" 
        runat="server" AutoPostBack="True">
        <asp:ListItem Selected="True" Value="1">デフォルト</asp:ListItem>
        <asp:ListItem Value="2">備考の幅 25em</asp:ListItem>
        <asp:ListItem Value="3">備考を非表示</asp:ListItem>
    </asp:RadioButtonList>
    <asp:GridView ID="GridView1" 
      runat="server"
      AutoGenerateColumns="False" 
      OnPreRender="GridView1_PreRender">
      <Columns>
        <asp:BoundField DataField="Code" 
          HeaderText="コード" >
        </asp:BoundField>
        <asp:BoundField DataField="Name" 
          HeaderText="商品名" >
        </asp:BoundField>
        <asp:BoundField DataField="Price" 
          HeaderText="単価" >
        </asp:BoundField>
        <asp:BoundField DataField="Qty" 
          HeaderText="数量" >
        </asp:BoundField>
        <asp:BoundField DataField="Amount" 
          HeaderText="合価" >
        </asp:BoundField>
        <asp:BoundField DataField="Remarks" 
          HeaderText="備考" >
        </asp:BoundField>
      </Columns>
    </asp:GridView>
    </form>
</body>
</html>

編集 履歴 (0)
  • こんにちは。組み込んで動作確認させてもらい、問題なく実現できました。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。