怎样在.net的GridView中每五行空一行或者显示分割线?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样在.net的GridView中每五行空一行或者显示分割线?相关的知识,希望对你有一定的参考价值。

不是你说的那样,问题是我的gridview已经绑定了 在显示时我想每隔五行就空一行或者显示分隔线 就类似图片中的一样 也就是在gridview的RowDataBound事件中给这一行添加属性之类的 具体的是什么我就不知道了

思路:修改第五行的样式,使第五行的下边框颜色为灰色,然后距离最下留15px的空白;修改第六行的样式,然后距离最上留15px的空白。这样看上去就像是每隔五行有一条空白数据作为分隔。

/* --- 数据行绑定 --- */
protected void XXX_RowDataBound(object sender, GridViewRowEventArgs e)

if (e.Row.RowType == DataControlRowType.DataRow)

/* --- 数据行为第五(倍数)或者第六(倍数)的时候 --- */
if (e.Row.RowIndex != 0 && (e.Row.RowIndex % 4 == 0 || e.Row.RowIndex % 5 == 0))

foreach (TableCell cell in e.Row.Cells)

/* --- 添加样式 --- */
cell.Attributes.Add("style", e.Row.RowIndex % 4 == 0 ? "padding-bottom:15px; border-bottom:solid 1px Gray" : "padding-top:15px");



参考技术A 用JS吧,如果你会jquery,会更容易.
用JS你可以先找到所有数据行,然后循环遍历,对满足条件的行的所有td设置border-bottom即可。
参考技术B 你取数据的时候构造的dataset每五行空一行不就好了?然后再绑定到Gridview上 参考技术C 修改第五行的样式,使第五行的下边框颜色为灰色,然后距离最下留15px的空白;修改第六行的样式,然后距离最上留15px的空白。这样看上去就像是每隔五行有一条空白数据作为分隔。

GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridView已经走上了历史的前台,取代DataGrid的趋势已是势不可挡。GridView和DataGrid功能相似,都是在web页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在web页面上输出表格中的一行。

pyspark 获取一行中每一列的最新非空元素

【中文标题】pyspark 获取一行中每一列的最新非空元素【英文标题】:pyspark get latest non-null element of every column in one row 【发布时间】:2022-01-23 14:24:32 【问题描述】:

让我用一个例子来解释我的问题: 我有一个数据框:

pd_1 = pd.DataFrame('day':[1,2,3,2,1,3], 
                     'code': [10, 10, 20,20,30,30],
                     'A': [44, 55, 66,77,88,99],
                     'B':['a',None,'c',None,'d', None],
                     'C':[None,None,'12',None,None, None]
                    )
df_1 = sc.createDataFrame(pd_1)
df_1.show()

输出:

+---+----+---+----+----+
|day|code|  A|   B|   C|
+---+----+---+----+----+
|  1|  10| 44|   a|null|
|  2|  10| 55|null|null|
|  3|  20| 66|   c|  12|
|  2|  20| 77|null|null|
|  1|  30| 88|   d|null|
|  3|  30| 99|null|null|
+---+----+---+----+----+

我想要实现的是一个新的数据框,每一行对应一个code,并且对于每一列,我想要拥有最新的非空值(最高的day)。

在 pandas 中,我可以简单地做

pd_2 = pd_1.sort_values('day', ascending=True).groupby('code').last()
pd_2.reset_index()

得到

    code    day A   B   C
0   10       2  55  a   None
1   20       3  66  c   12
2   30       3  99  d   None

我的问题是,如何在 pyspark(最好是版本


到目前为止我尝试过的是:

from pyspark.sql import Window
import pyspark.sql.functions as F

w = Window.partitionBy('code').orderBy(F.desc('day')).rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)

## Update: after applying @Steven's idea to remove for loop:
df_1 = df_1 .select([F.collect_list(x).over(w).getItem(0).alias(x) for x in df_.columns])

##for x in df_1.columns:
##    df_1 = df_1.withColumn(x, F.collect_list(x).over(w).getItem(0))

df_1 = df_1.distinct()
df_1.show()

输出

+---+----+---+---+----+
|day|code|  A|  B|   C|
+---+----+---+---+----+
|  2|  10| 55|  a|null|
|  3|  30| 99|  d|null|
|  3|  20| 66|  c|  12|
+---+----+---+---+----+

我不太满意,尤其是因为for loop

【问题讨论】:

这能回答你的问题吗? How to select the item that has the greatest value in dataframe ? In Pyspark @Steven 谢谢。但我认为它会有同样的循环遍历所有列的问题:| 如果您的问题只是 for 循环,请将其更改为 select 中的列表理解 改进代码是个好主意:) 问题是最后一行将包含来自不同行的元素(使用相同的代码),而不仅仅是选择一行。我认为它不能使用单个 row_number 函数来完成。但如果我错过了什么,请告诉我或写一个答案:) 【参考方案1】:

这是另一种使用数组函数和结构排序而不是窗口的方法:

from pyspark.sql import functions as F

other_cols = ["day", "A", "B", "C"]

df_1 = df_1.groupBy("code").agg(
    F.collect_list(F.struct(*other_cols)).alias("values")
).selectExpr(
    "code",
    *[f"array_max(filter(values, x-> x.c is not null))['c'] as c" for c in other_cols]
)

df_1.show()
#+----+---+---+---+----+
#|code|day|  A|  B|   C|
#+----+---+---+---+----+
#|  10|  2| 55|  a|null|
#|  30|  3| 99|  d|null|
#|  20|  3| 66|  c|  12|
#+----+---+---+---+----+

【讨论】:

【参考方案2】:

我认为您当前的解决方案非常好。如果您想要其他解决方案,可以尝试使用first/last 窗口函数:

from pyspark.sql import functions as F, Window

w = Window.partitionBy("code").orderBy(F.col("day").desc())


df2 = (
    df.select(
        "day",
        "code",
        F.row_number().over(w).alias("rwnb"),
        *(
            F.first(F.col(col), ignorenulls=True)
            .over(w.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing))
            .alias(col)
            for col in ("A", "B", "C")
        ),
    )
    .where("rwnb = 1")
    .drop("rwnb")
)

结果:

df2.show()

+---+----+---+---+----+
|day|code|  A|  B|   C|
+---+----+---+---+----+
|  2|  10| 55|  a|null|
|  3|  30| 99|  d|null|
|  3|  20| 66|  c|  12|
+---+----+---+---+----+

【讨论】:

以上是关于怎样在.net的GridView中每五行空一行或者显示分割线?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net中GridView怎样进行分页,编辑,删除操作

asp.net中怎样实现在GridView中直接编辑数据?

在 Gridview 中选择一行并将其删除 - Asp.net

DevExpress 中gridview怎么才能新建一行?其中的gridview1.AddNewRecord()方法没用

用ASP.NET怎样动态给dropdownlist控件赋值

如何在gridview中增加一行记录