当前位置: 代码迷 >> ASP.NET >> .DEV控件
  详细解决方案

.DEV控件

热度:3286   发布时间:2013-02-25 00:00:00.0
在线等..DEV控件
AspxGridview如何合并单元格,就是把一列值相同的合并成一个单元格,并且只显示一个值就可以了,看清题目是AspxGridview。不是Gridview

------解决方案--------------------------------------------------------
DevExpress的局限性比较大,每个控件都有自身的固定用法,使用固定用法才能做到事半功倍(拖控件-》数据源-》绑定列-》设置属性 就可以完成很多复杂的工作了),你所说的需求,不是AspxGridview能简单实现的,真的要实现,也要写大量代码去修改AspxGridview的事件,这就违背了你用DevExpress控件的初衷了。
列合并的需求一般是用ASPxPivotGrid控件来完成。

------解决方案--------------------------------------------------------
对,这种需求要么使用别的控件,要么就不要用AspxGridview了。
玩这套控件,最好就是限定在它提供给你框框里,要不然做起来很累,还不如使用Repeat、GridView这些自带控件来完成,自由度比较大。
DevExpress封装性太强了,所以自定能力就变得很弱。。。。。。 当然,如果你的需求本来就是在它提供的框框之内的,使用起来是非常方便的,工作量也可以大幅度降低。。。
------解决方案--------------------------------------------------------
探讨

我这有一段代码:你帮忙看看
private List<string> processedCompanyList = new List<string>();
protected void grid_HtmlRowCreated(object sender, ASPxGridViewTableRowEventArgs e)
{
if (e.RowTyp……

------解决方案--------------------------------------------------------
private List<string> processedProjectIdList = new List<string>();
private Dictionary<string, string> processedCheckOrderDic = new Dictionary<string, string>();
protected void grid_HtmlRowCreated(object sender, ASPxGridViewTableRowEventArgs e)
{
if (e.RowType == GridViewRowType.Data)
{
string ProjectId = (e.GetValue("ProjectId") ?? "").ToString();
if (!string.IsNullOrEmpty(ProjectId) && !processedProjectIdList.Contains(ProjectId))
{
int rowSpanCount = gdc.GetDataSet<JCheckIndex>().Where(p => p.ProjectId == ProjectId).Count();
e.Row.Cells[ProjectId的columnIndex].RowSpan = rowSpanCount; // 关键在这里跨行合并
processedProjectIdList.Add(ProjectId);
}
else
{
e.Row.Cells[ProjectId的columnIndex].Visible = false; // 被合并的行应该少一列
}

string CheckOrder = (e.GetValue("CheckOrder") ?? "").ToString();
if (!string.IsNullOrEmpty(CheckOrder) && !processedCheckOrderDic.ContainsKey(ProjectId) && !processedCheckOrderDic[ProjectId].Contains(CheckOrder))
{
int rowSpanCount = gdc.GetDataSet<JCheckIndex>().Where(p => p.ProjectId == ProjectId && p.CheckOrder == CheckOrder).Count();
e.Row.Cells[CheckOrder的columnIndex].RowSpan = rowSpanCount; // 关键在这里跨行合并
processedCheckOrderList.Add(ProjectId);
}
else
{
e.Row.Cells[CheckOrder的columnIndex].Visible = false; // 被合并的行应该少一列
}

//列越多, 数据结构越复杂
}
}


我没验证过代码是否正确, 就是提供给你一个思路, 只有一列的时候, 数据结构相对简单,用List<string>就能解决;
两列的时候,要在第一列合并的基础上判断, 所以要用Dictionary<string, string>;
如果再多的时候,就需要自己建一个class,重写Equal方法。代码就变得很复杂了
  相关解决方案