teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

具体的方法の追記

2016/10/05 03:47

投稿

退会済みユーザー
answer CHANGED
@@ -97,3 +97,147 @@
97
97
  http://surferonwww.info/BlogEngine/image.axd?picture=2016%2f9%2fgridviewtextoverflow.jpg
98
98
 
99
99
  ただし、やはりブラウザ依存のようで(text-overflow:ellipsis はもともと IE の独自拡張)、自分が試した限りでは IE9, Firefox 49.0.1, Chrome 49.0.2623.112 m, Safari 5.1.7 (7534.57.2) では OK だったものの、Opera 12.18 では三点リーダーが表示されませんでした。
100
+
101
+ 【2016/10/5 12:48 追記】
102
+
103
+ 私の 2016/10/05 12:09 のコメントで、
104
+
105
+ > 「やり方の問題」とか書いておいて、そうではなかったりすると何なので、後で検証して結果を回答欄に追記しておきます。
106
+
107
+ と書きましたように、上の【2016/10/4 12:45 追記】 のサンプルに DataTables を適用して検証してみました。
108
+
109
+ 結果は以下の画像のとおりで、「三点リーダー」は表示されます。
110
+
111
+ http://surferonwww.info/BlogEngine/image.axd?picture=2016%2f9%2fgridviewanddatatables.jpg
112
+
113
+ 質問者さんが試してダメだったのは、多分横方向のスクロール scrollX: true を設定したからだと思います。
114
+
115
+ scrollX: true があると columnDefs: [ ... ] で幅を設定しても無視され、文字列分の幅が確保されるので結果「三点リーダー」は表示されないということになるようです。(理由は不明。実際に試してそうなりました)
116
+
117
+ 上の画像のコードは以下の通りです。コメントアウトした scrollX: true, を有効にして試すと上で私が言ったことが分かると思います。
118
+
119
+ ```
120
+ <%@ Page Language="C#" %>
121
+ <%@ Import Namespace="System.Data" %>
122
+
123
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
124
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
125
+
126
+ <script runat="server">
127
+ // データソース用の DataTable を作成
128
+ protected DataTable CreateDataTable()
129
+ {
130
+ DataTable dt = new DataTable();
131
+ DataRow dr;
132
+
133
+ dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
134
+ dt.Columns.Add(new DataColumn("Name", typeof(string)));
135
+ dt.Columns.Add(new DataColumn("Type", typeof(string)));
136
+ dt.Columns.Add(new DataColumn("Price", typeof(Int32)));
137
+ dt.Columns.Add(new DataColumn("Qty", typeof(Int32)));
138
+ dt.Columns.Add(new DataColumn("Amount", typeof(Int32)));
139
+ dt.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
140
+ dt.Columns.Add(new DataColumn("Note", typeof(string)));
141
+ dt.Columns.Add(new DataColumn("Discontinued", typeof(bool)));
142
+ dt.Columns.Add(new DataColumn("DateTime", typeof(DateTime)));
143
+
144
+ for (int i = 0; i < 20; i++)
145
+ {
146
+ dr = dt.NewRow();
147
+ dr["ID"] = i;
148
+ dr["Name"] = (i % 2 == 0) ?
149
+ "Name_" + i.ToString() : "Long Long Name_" + i.ToString();
150
+ dr["Type"] = (i % 2 == 0) ?
151
+ "Long Long Product Type " + (100 - i).ToString() : "Type " + (100 - i).ToString();
152
+ dr["Price"] = 123000 * (i + 1);
153
+ dr["Qty"] = (i + 1) * 20;
154
+ dr["Amount"] = 123000 * (i + 1) * (i + 1);
155
+ dr["CategoryID"] = 100 - i;
156
+ dr["Note"] = "Note_" + i.ToString();
157
+ dr["Discontinued"] = (i % 2 == 0) ? true : false;
158
+ dr["DateTime"] = DateTime.Now.AddDays(i);
159
+ dt.Rows.Add(dr);
160
+ }
161
+ return dt;
162
+ }
163
+
164
+ // GridView に上記メソッドで作った DataTable をバインド
165
+ protected void Page_Load(object sender, EventArgs e)
166
+ {
167
+ if (!IsPostBack)
168
+ {
169
+ GridView1.DataSource = CreateDataTable();
170
+ GridView1.DataBind();
171
+ }
172
+ }
173
+
174
+ // GridView に thead, tbody, tfoot 要素を追加
175
+ protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
176
+ {
177
+ if (e.Row.RowType == DataControlRowType.Header)
178
+ {
179
+ e.Row.TableSection =
180
+ System.Web.UI.WebControls.TableRowSection.TableHeader;
181
+ }
182
+ else if (e.Row.RowType == DataControlRowType.DataRow)
183
+ {
184
+ e.Row.TableSection =
185
+ System.Web.UI.WebControls.TableRowSection.TableBody;
186
+ }
187
+ else if (e.Row.RowType == DataControlRowType.Footer)
188
+ {
189
+ e.Row.TableSection =
190
+ System.Web.UI.WebControls.TableRowSection.TableFooter;
191
+ }
192
+ }
193
+ </script>
194
+
195
+ <html xmlns="http://www.w3.org/1999/xhtml">
196
+ <head runat="server">
197
+ <title></title>
198
+ <script src="/Scripts/jquery-1.11.1.js" type="text/javascript"></script>
199
+ <script src="/datatables-1.10.12/js/jquery.dataTables.js" type="text/javascript"></script>
200
+ <link href="/datatables-1.10.12/css/jquery.dataTables.css" rel="stylesheet" type="text/css" />
201
+ <script type="text/javascript">
202
+ //<![CDATA[
203
+ $(document).ready(function () {
204
+ $("#<%=GridView1.ClientID%>").DataTable({
205
+ // scrollX: true,
206
+ // scrollY: 200,
207
+ columnDefs: [
208
+ { targets: 0, width: 50 },
209
+ { targets: 1, width: 100 },
210
+ { targets: 2, width: 100 }
211
+ ]
212
+ });
213
+ });
214
+ //]]>
215
+ </script>
216
+
217
+ <style type="text/css">
218
+ table {
219
+ width: 100%;
220
+ table-layout: fixed;
221
+ }
222
+
223
+ table th, td {
224
+ white-space: nowrap;
225
+ overflow: hidden;
226
+ text-overflow: ellipsis;
227
+ }
228
+
229
+ </style>
230
+
231
+ </head>
232
+ <body>
233
+ <form id="form1" runat="server">
234
+ <asp:GridView ID="GridView1"
235
+ runat="server"
236
+ EnableViewState="False"
237
+ OnRowCreated="GridView1_RowCreated"
238
+ ShowFooter="True">
239
+ </asp:GridView>
240
+ </form>
241
+ </body>
242
+ </html>
243
+ ```

1

具体的方法の追記

2016/10/05 03:47

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,99 @@
1
1
  質問の内容が理解できていませんが「三点リーダーにしたい」ということは、以下の記事の最後の方に書いてある「2015/11/12 追記」のような表示にしたいということですか?
2
2
 
3
3
  GridView に overflow 適用
4
- http://surferonwww.info/BlogEngine/post/2015/11/10/apply-overflow-to-a-column-of-gridview.aspx
4
+ http://surferonwww.info/BlogEngine/post/2015/11/10/apply-overflow-to-a-column-of-gridview.aspx
5
+
6
+ 【2016/10/4 12:45 追記】
7
+
8
+ 私の 2016/10/04 12:08 のコメントでも書きましたが、td 要素に overflow: hidden;、white-space: nowrap;、text-overflow: ellipsis; というスタイルを適用して期待通り三点リーダーが表示されたのは、親の table 要素に table-layout: fixed; というスタイルが適用されていたからでした。
9
+
10
+ DataTables にはもともと「三点リーダー」にするようなスタイルは適用されていないようですが、そうであれば親の table 要素に table-layout: fixed; というスタイルを、子の th, td 要素に overflow: hidden;、white-space: nowrap;、text-overflow: ellipsis; というスタイルを適用したらいかがでしょう?
11
+
12
+ コメントに「あとで、回答欄に GridView ではどのようにできるかという例を書いておきます」と書きましたが、検証に使ったサンプルコードを以下に書いておきます。Web サイトプロジェクトならそのままコピペして、Web アプリケーションプロジェクトなら .aspx と .aspx.cs に分ければ試すことができますので、興味があればやってみてください。
13
+
14
+ ```
15
+ <%@ Page Language="C#" %>
16
+ <%@ Import Namespace="System.Data" %>
17
+
18
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
19
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
20
+
21
+ <script runat="server">
22
+ // データソース用の DataTable を作成
23
+ protected DataTable CreateDataTable()
24
+ {
25
+ DataTable dt = new DataTable();
26
+ DataRow dr;
27
+
28
+ dt.Columns.Add(new DataColumn("ID", typeof(Int32)));
29
+ dt.Columns.Add(new DataColumn("Name", typeof(string)));
30
+ dt.Columns.Add(new DataColumn("Type", typeof(string)));
31
+ dt.Columns.Add(new DataColumn("Price", typeof(Int32)));
32
+ dt.Columns.Add(new DataColumn("Qty", typeof(Int32)));
33
+ dt.Columns.Add(new DataColumn("Amount", typeof(Int32)));
34
+ dt.Columns.Add(new DataColumn("CategoryID", typeof(Int32)));
35
+ dt.Columns.Add(new DataColumn("Note", typeof(string)));
36
+ dt.Columns.Add(new DataColumn("Discontinued", typeof(bool)));
37
+ dt.Columns.Add(new DataColumn("DateTime", typeof(DateTime)));
38
+
39
+ for (int i = 0; i < 20; i++)
40
+ {
41
+ dr = dt.NewRow();
42
+ dr["ID"] = i;
43
+ dr["Name"] = "Product Name_" + i.ToString();
44
+ dr["Type"] = "Product Type " + (100 - i).ToString();
45
+ dr["Price"] = 123000 * (i + 1);
46
+ dr["Qty"] = (i + 1) * 20;
47
+ dr["Amount"] = 123000 * (i + 1) * (i + 1);
48
+ dr["CategoryID"] = 100 - i;
49
+ dr["Note"] = "Note_" + i.ToString();
50
+ dr["Discontinued"] = (i % 2 == 0) ? true : false;
51
+ dr["DateTime"] = DateTime.Now.AddDays(i);
52
+ dt.Rows.Add(dr);
53
+ }
54
+ return dt;
55
+ }
56
+
57
+ // GridView に上記メソッドで作った DataTable をバインド
58
+ protected void Page_Load(object sender, EventArgs e)
59
+ {
60
+ if (!IsPostBack)
61
+ {
62
+ GridView1.DataSource = CreateDataTable();
63
+ GridView1.DataBind();
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <html xmlns="http://www.w3.org/1999/xhtml">
69
+ <head runat="server">
70
+ <title></title>
71
+ <style type="text/css">
72
+ table {
73
+ width: 100%;
74
+ table-layout: fixed;
75
+ }
76
+
77
+ table th, td {
78
+ white-space: nowrap;
79
+ overflow: hidden;
80
+ text-overflow: ellipsis;
81
+ }
82
+
83
+ </style>
84
+ </head>
85
+ <body>
86
+ <form id="form1" runat="server">
87
+ <asp:GridView ID="GridView1" runat="server" EnableViewState="False">
88
+ </asp:GridView>
89
+ </form>
90
+ </body>
91
+ </html>
92
+
93
+ ```
94
+
95
+ 上のコードの実行結果は以下の画像のようになります。(ブラウザは Chrome)
96
+
97
+ http://surferonwww.info/BlogEngine/image.axd?picture=2016%2f9%2fgridviewtextoverflow.jpg
98
+
99
+ ただし、やはりブラウザ依存のようで(text-overflow:ellipsis はもともと IE の独自拡張)、自分が試した限りでは IE9, Firefox 49.0.1, Chrome 49.0.2623.112 m, Safari 5.1.7 (7534.57.2) では OK だったものの、Opera 12.18 では三点リーダーが表示されませんでした。