http://demo.shopex.com.cn/485/shopadmin/index.php?ctl=passport&act=login
user:admin
pass:admin进了点"商品",就会显示商品列表
在他里面的表头的最后有一个图片点击后可以自定义他的列的输出大家说说他的设计思想是怎么样的谢谢
user:admin
pass:admin进了点"商品",就会显示商品列表
在他里面的表头的最后有一个图片点击后可以自定义他的列的输出大家说说他的设计思想是怎么样的谢谢
解决方案 »
- “GridView1”上同时定义了 DataSource 和 DataSourceID。请移除一个定义。
- 郁闷,SmtpClient发送邮件的内容是否有限制
- 后台获取前台table里的值
- **************怎么样才能把信息同步到新浪微博呢?**************
- 关于远程协助
- ajax和web.config疑难杂症,期待高手,给答案马上结帖!!!
- 问个有关window.open的简单问题!马上结分!
- 高手请进
- 我的一个台湾朋友,在一家台湾软件公司工作,想在大陆寻求PHP和ASP高手合作,哪位有兴趣,请速于我联系
- 网页无法正常保存
- 【100分再问事务回滚】看看有会的没
- 查询数据 结果怎么显示在datagrid中啊
其实很简单,点击保存选择结果后,JS会提交后台获取数据,然后前台绑定!
我是说要如何来设计
因为现在我也想做这样的后台管理
谢谢
然后用户选中一些后再保存到哪里?数据库?因为他是第个人定制了以后再进来都会保持一样的?
也就是说
用户选择了要显示哪些字段=>然后保存到用户的自定义显示表中=》重新执行查询=》后台在输出的时候根据用户定义了显示哪些字段输出HTML?
1:列表中用户可以勾选的字段的由来
因为用户是查询商品表,那么首先是由List<product>出来
然后我创建一个DTO ProductDTO,也就是显示的所有字段
那么在前台用户选择的地方我就可以列出来了
2:如何进行保存
新表一个表UserViewDefine字段有
DTOName(也就是他显示的哪个DTO的TypeName)
Selected(是否勾选)
SortNumber(排序号,也就是他可以拖动后进行排序)
3: 具体实现
1:面页读取用户对应的UserViewDefine显示出那个自定义显示DIV
2:当用户拖动和修改了显示设置的时候点应用,保存到UserViewDefine表中
3:重新执行查询方法,我通过Ajax调用生成面页如list.aspx
4:List.aspx根据用户查询读取表信息生成List<Product>
5: 我将List<Product>转化为List<ProductDTO>
6: 读取出当前用户当前DTO的用户设置,并从小到大进行排列
7: 循环我的List<ProductDTO>进循环我的配置反射出当前配置顺序的值再根据行模版生成HTML
8:前台显示页面接收到生成的HTML替换原来的表列信息大家看有没有问题,就是自己感觉太复杂了
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Linq" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>test</title>
<link type="text/css" href="http://jqueryui.com/themes/ui-lightness/ui.all.css" rel="stylesheet" />
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ></script>
<script type="text/javascript" src="http://jqueryui.com/ui/ui.core.js"></script>
<script type="text/javascript" src="http://jqueryui.com/ui/ui.sortable.js"></script>
<script type="text/javascript" src="http://jqueryui.com/ui/ui.draggable.js"></script>
<script type="text/javascript" src="http://jqueryui.com/ui/ui.dialog.js"></script>
</head>
<body>
<form id="form1" runat="server"><script type="text/javascript">
$(function() {
// 用jquery实现CheckBox1排序功能
$("#CheckBoxList1").sortable({
items: 'tr',
update: function() {
var arr = $.map($("#CheckBoxList1 label"), function(n){ return $(n).text(); });
$("#HiddenField1").val(arr.join(',')); // 拍完序后的字段名称记录在隐藏域HiddenField1中
}
});
// 用jquery实现选择字段弹出对话框
$("#ColumnsPicker").dialog({
autoOpen: false,
open: function() { $("body > div[role=dialog]").appendTo("#form1"); }
});
});
</script><a href="#" onclick="$('#ColumnsPicker').dialog('open'); return false;">选择字段</a>
<!-- 选择字段对话框 -->
<div id="ColumnsPicker" title="选择字段">
<asp:CheckBoxList ID="CheckBoxList1" runat="server" /><!-- 字段选择列表 -->
<asp:HiddenField ID="HiddenField1" runat="server" /><!-- 保存字段顺序的隐藏域 -->
(拖动鼠标对字段进行排序)
<asp:Button ID="Button1" runat="server" Text="确定" OnClick="Button1_Click" />
</div><!-- 用GridView显示表格 -->
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
AutoGenerateColumns="false" AllowPaging="true" AllowSorting="true">
</asp:GridView><!-- DataSource, 这里要改成你的数据库连接串和查询语句 -->
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString='....'
SelectCommand="select * from <table>" ></asp:SqlDataSource></form>
</body>
</html><script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return; string[] columns, selections; // 从cookie中读取选择的字段,如果cookie不存在,就从数据库中取到字段信息
HttpCookie cookie = Request.Cookies["MyTableConfig"];
if (cookie == null)
{
// 这里是从目标表中提取字段名称,如果你希望用中文名称,可以改成专门建一个字段名称表从中读取
DataView dv = SqlDataSource1.Select(new DataSourceSelectArguments()) as DataView;
var cols = (DataColumn[])new ArrayList(dv.Table.Columns).ToArray(typeof(DataColumn));
columns = Array.ConvertAll<DataColumn, string>(cols, c => c.ColumnName);
selections = columns; // 所有的字段缺省都是选中
}
else
{
// 用cooke保存字段数据的效果是每客户端可独立持久化
// 如果你希望每个用户有独立的持久化效果,可改成UserProfile或用数据表来保存
columns = cookie["Columns"].Split(',');
selections = cookie["Selections"].Split(',');
}
UpdateTable(columns, selections);
} // 动态创建页面选择字段列表、显示表格
private void UpdateTable(string[] columns, string[] selections)
{
HiddenField1.Value = string.Join(",", columns); // 隐藏域中保存顺序排列的所有字段
CheckBoxList1.Items.Clear();
GridView1.Columns.Clear(); // 把每个字段填充到选择列表并为选中字段建立GridView显示列
foreach (string col in columns)
{
ListItem item = new ListItem(col);
item.Selected = Array.Exists(selections, sel => sel == col);
CheckBoxList1.Items.Add(item); if (item.Selected)
{
BoundField field = new BoundField();
field.DataField = field.HeaderText = field.SortExpression = col;
GridView1.Columns.Add(field);
}
}
} // 字段选择改变后,保存选择的字段信息,并重新创建页面
protected void Button1_Click(object sender, EventArgs e)
{
// 从隐藏域中提取所有顺序排列的字段
string[] columns = HiddenField1.Value.Split(',');
// 从选择列表中提取选中的字段信息
var selections = from ListItem item in CheckBoxList1.Items where item.Selected select item.Text;
// 保存到cookie中
HttpCookie cookie = new HttpCookie("MyTableConfig");
cookie["Columns"] = string.Join(",", columns);
cookie["Selections"] = string.Join(",", selections.ToArray());
Response.Cookies.Set(cookie);
// 重建页面
UpdateTable(columns, selections.ToArray());
}
</script>说明:
SqlDataSource1中的连接串和查询语句要改下,这里用的字段名字直接是数据表的字段名,如果你想用中文名字的话,应该用专门的表(或配置文件)来存放,程序要做些改动。
其实只是把要显示的字段保存为json格式或其它格式,然后列表刷新的时候根据要字段信息,显示和隐藏列。
字段信息可以保存在Cookie,Session,隐藏域,都可以的。根本没楼主想的那么复杂。
新建 DTO 大可不必,没必要过于技术化, 用现有 product 实体类即可,如果没有可以考虑创建。可以就两个字段,一个是userID,另一个是 勾选了的 TypeName ,
意思是只存储用户选择了的 TypeName ,存储格式是 ',' 分隔 。 按照排序的顺序存储用户修改的时候 就修改该字段即可。4:List.aspx根据用户查询读取表信息生成List <Product>
5: 我将List <Product>转化为List <ProductDTO>
6: 读取出当前用户当前DTO的用户设置,并从小到大进行排列这个可以考虑合并,DTO可以省略
$("#CheckBoxList1")=》$("#<%=CheckBoxList1.ClientID%>")服务器控件不要直接写ID