一些GridView的扩展

 public static class GridViewExtension
{
  public static void DataBindFieldCellHandle(this GridViewRow gvr, string bindFieldName, Action<TableCell> action)
    {
        for (int i = 0; i < gvr.Cells.Count; i++)
        {
            TableCell tc = gvr.Cells[i];
            BoundField field = ((DataControlFieldCell)tc).ContainingField as BoundField;
            if (field != null && field.DataField.ToLower().Equals(bindFieldName.ToLower()))           
{
                action(tc);
            }
        }
    }
}

example:

e.Row.DataBindFieldCellHandle("ShortestPath"



, (TableCell tablecell) =>

{

   tablecell.Text = "<a title='"
+ Server.HtmlEncode(tablecell.Text) + "'>"
+ PageBase.Trunc(tablecell.Text, 30) + "</a>"
;

});



and more。。。。

using System;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web.UI.WebControls;
using System.Collections.Generic;

namespace DataCenterAnalysis.Data.Common
{


public static class GridViewExtensions
{

/// <summary>
/// 固定行数的datatable
/// </summary>
/// <param name="dataTable"></param>
/// <param name="n"></param>
/// <returns></returns>
public static DataTable GenerateNumDataRow(this DataTable dataTable, int n)
{
if (dataTable != null && dataTable.Rows.Count < n)
{
int less = n - dataTable.Rows.Count;
for (int i = 0; i < less; i++)
{
dataTable.Rows.Add(dataTable.NewRow());
}
}
return dataTable;
}

/// <summary>
/// 隐藏英文标题的GridView
/// </summary>
/// <param name="GridView1"></param>
/// <returns></returns>
public static GridView HideEnHeader(this GridView GridView1)
{
foreach (DataControlField dcf in GridView1.Columns)
{
if (!WordsIScn(dcf.HeaderText))
{
dcf.Visible = false;
}
}
return GridView1;
}

/// <summary>
/// 通过关键字隐藏gridview列
/// </summary>
/// <param name="gridView"></param>
/// <param name="key"></param>
/// <returns></returns>
public static GridView HideHeaderByKey(this GridView gridView, string key)
{

for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
{
TableCell tc = gridView.HeaderRow.Cells[i];
if (tc.Text.IndexOf(key) >= 0)
{
tc.Visible = false;
}
}

foreach (GridViewRow row in gridView.Rows)
{
foreach (TableCell cell in row.Cells)
{
BoundField field = (BoundField)((DataControlFieldCell)cell).ContainingField;
if (field.DataField.IndexOf(key) >= 0)
{
field.Visible = false;
}
}
}
return gridView;
}

/// <summary>
/// 通过列名关键字隐藏相关的列
/// </summary>
/// <param name="dt"></param>
/// <param name="key"></param>
/// <returns></returns>
public static DataTable HideHeaderByKey(this DataTable dt, string key)
{
if (dt != null && dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
DataColumn dc = dt.Columns[i];
if (dc.ColumnName.IndexOf(key) >= 0)
{
dt.Columns.Remove(dc);
}
}
}
return dt;
}

/// <summary>
/// 隐藏英文列名的相关列
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static DataTable HideEnHeader(this DataTable dt)
{
if (dt != null && dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
DataColumn dc = dt.Columns[i];
if (!WordsIScn(dc.ColumnName))
{
dt.Columns.Remove(dc);
}
}
}
return dt;
}

/// <summary>
/// 设置超标值的样式
/// </summary>
/// <param name="gridView"></param>
/// <param name="standardColumnName"></param>
/// <param name="changeColumnName"></param>
/// <param name="className"></param>
/// <returns></returns>
public static GridView SetOverStandard(this GridView gridView, string standardColumnName, string changeColumnName, string className)
{
foreach (GridViewRow row in gridView.Rows)
{
List<string> columns = new List<string>();
foreach (TableCell cell in row.Cells)
{
BoundField field = (BoundField)((DataControlFieldCell)cell).ContainingField;
if (field.DataField.IndexOf(standardColumnName) >= 0)
{
int standard = -1;
try
{
standard =
Convert.ToInt32(Convert.ToDouble(cell.Text.ToString()));
}
catch (Exception)
{
standard = -1;
}
if (standard == 0)
{
string column = field.DataField.Replace(standardColumnName, "") + changeColumnName;
columns.Add(column);
}
}
}

foreach (TableCell cell in row.Cells)
{
BoundField field = (BoundField)((DataControlFieldCell)cell).ContainingField;
if (columns.IndexOf(field.DataField) >= 0)
{
cell.Text = "<span style='color:" + className + "'>" + cell.Text + "</span>";
}
}
}

//for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
//{
//     TableCell tc = gridView.HeaderRow.Cells[i];
//     if (tc.Text.IndexOf(standardColumnName) >= 0)
//     {
//          if (i < (gridView.HeaderRow.Cells.Count - 1))
//          {
//               foreach (GridViewRow row in gridView.Rows)
//               {
//                    int standard = -1;
//                    try
//                    {
//                         standard =
//                              Convert.ToInt32(Convert.ToDouble(row.Cells[i].Text.ToString()));
//                    }
//                    catch (Exception)
//                    {
//                         standard = -1;
//                    }

//                    if (standard == 0)
//                    {
//                         row.Cells[i + 1].Text = "<span class='" + className + "'>" + row.Cells[i + 1].Text + "</span>";
//                    }
//               }
//          }
//     }
//}
return gridView;
}

/// <summary>
/// 设置超标值样式
/// </summary>
/// <param name="dt"></param>
/// <param name="standardColumnName"></param>
/// <param name="className"></param>
/// <returns></returns>
public static DataTable SetOverStandard(this DataTable dt, string standardColumnName, string className)
{
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (dt.Columns[i].ColumnName.IndexOf(standardColumnName) >= 0)
{
if (row[dt.Columns[i].ColumnName] != null && row[dt.Columns[i].ColumnName] != DBNull.Value)
{
int standard = -1;
try
{
standard =
Convert.ToInt32(Convert.ToDouble(row[dt.Columns[i].ColumnName].ToString()));
}
catch (Exception)
{
standard = -1;
}

if (standard == 0 && i != (dt.Columns.Count - 1))
{
row[i + 1] = "<span class='" + className + "'>" + row[i + 1].ToString() + "</span>";
}

}
}
}
}
return dt;
}

/// <summary>
/// 转换datatable为string类型的数据
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static DataTable CloneDataTable(this DataTable dt)
{
DataTable cloneDt = new DataTable();
if (dt != null && dt.Rows.Count > 0)
{
foreach (DataColumn column in dt.Columns)
{
cloneDt.Columns.Add(column.ColumnName);
}
foreach (DataRow row in dt.Rows)
{
DataRow cloneRow = cloneDt.NewRow();
foreach (DataColumn column in dt.Columns)
{
cloneRow[column.ColumnName] = (row[column.ColumnName] == null ||
row[column.ColumnName] == DBNull.Value)
? ""
: row[column.ColumnName].ToString();
}
cloneDt.Rows.Add(cloneRow);
}
}
return cloneDt;
}

/// <summary>
/// 移除小数点后多余的零
/// </summary>
/// <param name="GridView1"></param>
/// <returns></returns>
public static GridView FormatZero(this GridView GridView1)
{
foreach (GridViewRow row in GridView1.Rows)
{
foreach (TableCell tc in row.Cells)
{
double value = 1.0;
if (double.TryParse(tc.Text, out value))
{
string ResultString = Regex.Replace(tc.Text, @"(/.[0-9]*[1-9])0*$", "$1");
ResultString = Regex.Replace(ResultString, @"(/.0)0*$", "$1");
tc.Text = ResultString.TrimEnd('.');
}
}
}
return GridView1;
}

/// <summary>
/// 移除小数点后多余的零
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static DataTable FormatZero(this DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
if (dc.DataType == typeof(Double))
{
if (row[dc.ColumnName] != null && row[dc.ColumnName] != DBNull.Value)
{
string ResultString = row[dc.ColumnName].ToString();
ResultString = Regex.Replace(ResultString, @"(/.[0-9]*[1-9])0*$", "$1");
ResultString = Regex.Replace(ResultString, @"(/.0)0*$", "$1");
row[dc.ColumnName] = ResultString.TrimEnd('.');
}
}
}
}
return dt;
}


/// <summary>
/// 设置空值为零
/// </summary>
/// <param name="dt1"></param>
/// <returns></returns>
public static DataTable ChangeSpaceToZero(this DataTable dt1)
{
if (dt1 != null && dt1.Rows.Count > 0)
{
foreach (DataRow row in dt1.Rows)
{
foreach (DataColumn column in dt1.Columns)
{
row[column.ColumnName] = (row[column.ColumnName] == null
|| row[column.ColumnName] == DBNull.Value
|| row[column.ColumnName].ToString() == string.Empty
)
? "0"
: row[column.ColumnName];
}
}
}
return dt1;
}

/// <summary>
/// 数值转换为百分比
/// </summary>
/// <param name="dataTable"></param>
/// <param name="excludeColumns"></param>
/// <returns></returns>
public static DataTable NumToPecent(this DataTable dataTable, List<string> excludeColumns)
{
if (dataTable != null && dataTable.Rows.Count > 0)
{

foreach (DataRow row in dataTable.Rows)
{
double allValues = 0;
foreach (DataColumn column in dataTable.Columns)
{
if (excludeColumns.IndexOf(column.ColumnName) == -1)
{
double value = 0;
object cell = ((row[column.ColumnName] == null ||
row[column.ColumnName] == DBNull.Value)
? 0
: row[column.ColumnName]);
if (double.TryParse(cell.ToString(), out value))
{
allValues += value;
}
}
}

foreach (DataColumn column in dataTable.Columns)
{
if (excludeColumns.IndexOf(column.ColumnName) == -1)
{
double value = 0;
object cell = ((row[column.ColumnName] == null ||
row[column.ColumnName] == DBNull.Value)
? 0
: row[column.ColumnName]);
if (double.TryParse(cell.ToString(), out value))
{
row[column.ColumnName] = Math.Round(value / allValues, 4) * 100D;
}
}
}


}
}
return dataTable;
}


/// <summary>
/// 数值转换为百分比
/// </summary>
/// <param name="dataTable"></param>
/// <param name="excludeColumns"></param>
/// <returns></returns>
public static GridView NumToPecent(this GridView gridView, List<string> excludeColumns)
{
if (gridView.Rows.Count > 0)
{

foreach (GridViewRow row in gridView.Rows)
{
double allValues = 0;
for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
{
TableCell tableCell = gridView.HeaderRow.Cells[i];
if (excludeColumns.IndexOf(tableCell.Text) == -1)
{
double value = 0;
string cell = (row.Cells[i].Text == ""
? "0"
: row.Cells[i].Text);
if (double.TryParse(cell.ToString(), out value))
{
allValues += value;
}
}
}

for (int i = 0; i < gridView.HeaderRow.Cells.Count; i++)
{
TableCell tableCell = gridView.HeaderRow.Cells[i];
if (excludeColumns.IndexOf(tableCell.Text) == -1)
{
double value = 0;
string cell = (row.Cells[i].Text == ""
? "0"
: row.Cells[i].Text);
if (double.TryParse(cell.ToString(), out value))
{
row.Cells[i].Text = Convert.ToString(Math.Round(value / allValues, 4) * 100D);
}
}
}


}
}
return gridView;
}

/// <summary>
/// 比较字符类型的数据
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
private static int CompareDinosByLength(string x, string y)
{
if (x == null)
{
if (y == null)
{
// If x is null and y is null, they're
// equal.
return 0;
}
else
{
// If x is null and y is not null, y
// is greater.
return -1;
}
}
else
{
// If x is not null...
//
if (y == null)
// ...and y is null, x is greater.
{
return 1;
}
else
{
// ...and y is not null, compare the
// lengths of the two strings.
//
int retval = x.Length.CompareTo(y.Length);

if (retval != 0)
{
// If the strings are not of equal length,
// the longer string is greater.
//
return retval;
}
else
{
// If the strings are of equal length,
// sort them with ordinary string comparison.
//
return x.CompareTo(y);
}
}
}
}


/// <summary>
/// 交叉合并两个结构一致的Dt
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <param name="DTName"></param>
/// <param name="ColumnFirst">列标识</param>
/// <param name="ColumnSecond"></param>
/// <param name="func"></param>
/// <param name="keys"></param>
/// <returns></returns>
public static DataTable CrossMergerColumn(this DataTable dt1, DataTable dt2, string DTName, string ColumnFirst, string ColumnSecond, Func<string, string, string> func, params string[] keys)
{

DataTable dt3 = new DataTable();
if (dt1.Columns.Count != dt2.Columns.Count)
{
throw new ArgumentException("两个DataTable结构不一致!");
}
List<string> keysBothHave = new List<string>();
foreach (var s in keys)
{
if (dt1.Columns.IndexOf(s) >= 0 && dt2.Columns.IndexOf(s) >= 0)
{
keysBothHave.Add(s);
dt3.Columns.Add(s);
}
}
for (int i = 0; i < dt1.Columns.Count; i++)
{
if (keysBothHave.IndexOf(dt1.Columns[i].ColumnName) == -1)
{
dt3.Columns.Add(dt1.Columns[i].ColumnName + ColumnFirst);
if (!(keysBothHave.IndexOf(dt1.Columns[i].ColumnName) >= 0))
{
dt3.Columns.Add(dt2.Columns[i].ColumnName + ColumnSecond);
}
}
}

List<string> keysValueAllHave = new List<string>();
if (dt1 != null && dt1.Rows.Count > 0)
{
foreach (DataRow row in dt1.Rows)
{
keysValueAllHave.Add((row[keysBothHave[0]] ?? "").ToString());
}
}
if (dt2 != null && dt2.Rows.Count > 0)
{
foreach (DataRow row in dt2.Rows)
{
if (!(keysValueAllHave.IndexOf((row[keysBothHave[0]] ?? "").ToString()) >= 0))
{
keysValueAllHave.Add((row[keysBothHave[0]] ?? "").ToString());
}
}
}
int temp = 0;
if (keysValueAllHave.Count > 0 && int.TryParse(keysValueAllHave[0], out temp))
{
keysValueAllHave.Sort(CompareDinosByLength);
}
else
{
keysValueAllHave.Sort();
}

for (int i = 0; i < keysValueAllHave.Count; i++)
{
DataRow dr = dt3.NewRow();
dt3.Rows.Add(dr);

DataRow[] dt1rows = dt1.Select(keysBothHave[0] + "=" + keysValueAllHave[i]);
DataRow[] dt2rows = dt2.Select(keysBothHave[0] + "=" + keysValueAllHave[i]);

foreach (DataColumn column in dt1.Columns)
{
if (dt1rows != null && dt1rows.Count() == 1)
{
if (keysBothHave.IndexOf(column.ColumnName) >= 0)
{
dr[column.ColumnName] = dt1rows[0][column.ColumnName];
}
else
{
dr[column.ColumnName + ColumnFirst] = dt1rows[0][column.ColumnName];
dr[column.ColumnName + ColumnSecond] = dt1rows[0][column.ColumnName];
}
}
else
{
if (keysBothHave.IndexOf(column.ColumnName) >= 0)
{
dr[column.ColumnName] = "";
}
else
{
dr[column.ColumnName + ColumnFirst] = "";
dr[column.ColumnName + ColumnSecond] = "";
}
}
}

foreach (DataColumn column in dt2.Columns)
{
if (dt2rows != null && dt2rows.Count() == 1)
{
if (keysBothHave.IndexOf(column.ColumnName) >= 0)
{
dr[column.ColumnName] = dt2rows[0][column.ColumnName];
}
else
{
object obj = dt2rows[0][column.ColumnName];
if (func != null)
{
obj = func(dr[column.ColumnName + ColumnSecond].ToString(), obj.ToString());
}
dr[column.ColumnName + ColumnSecond] = obj;
}
}
else
{
if (keysBothHave.IndexOf(column.ColumnName) >= 0)
{
//dr[column.ColumnName] = "";
}
else
{
object obj = "";
if (func != null)
{
obj = func(dr[column.ColumnName + ColumnSecond].ToString(), obj.ToString());
}
dr[column.ColumnName + ColumnSecond] = obj;
}
}
}
}
dt3.TableName = DTName;
return dt3;
}

/// <summary>
/// 判断是否为中文
/// </summary>
/// <param name="words"></param>
/// <returns></returns>
public static bool WordsIScn(string words)
{
string TmmP;
for (int i = 0; i < words.Length; i++)
{
TmmP = words.Substring(i, 1);
byte[] sarr = System.Text.Encoding.GetEncoding("gb2312").GetBytes(TmmP);
if (sarr.Length == 2)
{
return true;
}
}
return false;
}

/// <summary>
/// 合并合并两行的数据
/// </summary>
/// <param name="GridView1"></param>
/// <param name="cellNum"></param>
public static void GroupTowRows(this GridView GridView1, int cellNum)
{
int i = 0, rowSpanNum = 1;
while (i < GridView1.Rows.Count - 1)
{
GridViewRow gvr = GridView1.Rows[i];
for (++i; i < GridView1.Rows.Count; i++)
{
GridViewRow gvrNext = GridView1.Rows[i];
if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text && i % 2 != 0)
{
gvrNext.Cells[cellNum].Visible = false;
rowSpanNum++;
}
else
{
gvr.Cells[cellNum].RowSpan = rowSpanNum;
rowSpanNum = 1;
break;
}

if (i == GridView1.Rows.Count - 1)
{
gvr.Cells[cellNum].RowSpan = rowSpanNum;
}
}
}
}


/// <summary>
/// 分组合并行数据
/// </summary>
/// <param name="GridView1"></param>
/// <param name="cellNum"></param>
public static void GroupRows(this GridView GridView1, int cellNum)
{
int i = 0, rowSpanNum = 1;
while (i < GridView1.Rows.Count - 1)
{
GridViewRow gvr = GridView1.Rows[i];
for (++i; i < GridView1.Rows.Count; i++)
{
GridViewRow gvrNext = GridView1.Rows[i];
if (gvr.Cells[cellNum].Text == gvrNext.Cells[cellNum].Text)
{
gvrNext.Cells[cellNum].Visible = false;
rowSpanNum++;
}
else
{
gvr.Cells[cellNum].RowSpan = rowSpanNum;
rowSpanNum = 1;
break;
}

if (i == GridView1.Rows.Count - 1)
{
gvr.Cells[cellNum].RowSpan = rowSpanNum;
}
}
}
}

/// <summary>
///  GridView行合并
/// </summary>
/// <param name="gridView"></param>
/// <param name="field">合并参数(匿名类型)
/// ColumnIndex:要合并行的索引 (以0开始,必须指定)
/// ID(可选):如果该行为模板行则必须指定
/// PropertyName:根据ID属性 默认值为Text
/// Colums:(string类型)表示额外的行合并方式和ColumnIndex一样(多个使用逗号隔开,如Colums="5,6,7,8")
/// 例:
/// 合并第一行(第一行为模板行),绑定的一个Label名称为lblName  根据Text属性值合并  第6行方式和第一行相同
/// new {ColumnIndex=0,ID="lblName",PropertyName="Text",Columns="5"}
/// </param>
public static GridView RowSpan(this GridView gridView, object field)
{
Dictionary<string, string> rowDictionary = ObjectLoadDictionary(field);
int columnIndex = int.Parse(rowDictionary["ColumnIndex"]);
string columnName = rowDictionary["ColumnName"];
string propertyName = rowDictionary["PropertyName"];
string columns = rowDictionary["Columns"];
for (var i = 0; i < gridView.Rows.Count; i++)
{

int rowSpanCount = 1;
for (int j = i + 1; j < gridView.Rows.Count; j++)
{
//绑定行合并处理
if (string.IsNullOrEmpty(columnName))
{
//比较2行的值是否相同
if (gridView.Rows[i].Cells[columnIndex].Text == gridView.Rows[j].Cells[columnIndex].Text)
{
//合并行的数量+1
rowSpanCount++;
//隐藏相同的行
gridView.Rows[j].Cells[columnIndex].Visible = false;
if (!string.IsNullOrEmpty(columns))
{
columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse(c)].Visible = false);
}
}
else
{
break;
}
}
else
{
//模板行的合并处理
if (GetPropertyValue(gridView.Rows[i].Cells[columnIndex].FindControl(columnName), propertyName) == GetPropertyValue(gridView.Rows[j].Cells[columnIndex].FindControl(columnName), propertyName))
{
rowSpanCount++;
//隐藏相同的行
gridView.Rows[j].Cells[columnIndex].Visible = false;
if (!string.IsNullOrEmpty(columns))
{

columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse(c)].Visible = false);
}
}
else
{
break;
}
}
}
if (rowSpanCount > 1)
{
//行合并
gridView.Rows[i].Cells[columnIndex].RowSpan = rowSpanCount;
//判断是否有额外的行需要合并
if (!string.IsNullOrEmpty(columns))
{
//额外的行合并
columns.Split(',').ToList<string>().ForEach(c => gridView.Rows[i].Cells[int.Parse(c)].RowSpan = rowSpanCount);
}
i = i + rowSpanCount - 1;
}


}
return gridView;
}

private static Dictionary<string, string> ObjectLoadDictionary(object fields)
{
Dictionary<string, string> resultDictionary = new Dictionary<string, string>();
PropertyInfo[] property = fields.GetType().GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.GetProperty);
foreach (PropertyInfo tempProperty in property)
{
resultDictionary.Add(tempProperty.Name, tempProperty.GetValue(fields, null).ToString());
}
//指定默认值
if (!resultDictionary.Keys.Contains("ColumnIndex"))
{
throw new Exception("未指定要合并行的索引 ColumnIndex 属性!");
}
if (!resultDictionary.Keys.Contains("ColumnName"))
{
resultDictionary.Add("ColumnName", null);
}

if (!resultDictionary.Keys.Contains("PropertyName"))
{
resultDictionary.Add("PropertyName", "Text");
}

if (!resultDictionary.Keys.Contains("Columns"))
{
resultDictionary.Add("Columns", null);
}
return resultDictionary;
}

/// <summary>
///  获取一个对象的一个属性..
/// </summary>
/// <param name="obj"></param>
/// <param name="PropertyName">属性名称</param>
/// <returns>属性的值,  如果无法获取则返回null</returns>
private static object GetPropertyValue(object obj, string PropertyName)
{
PropertyInfo property = obj.GetType().GetProperty(PropertyName);

return property.GetValue(obj, null);
}


public static void SetRowDataBound(GridView gvList, string columnHeaders)
{
foreach (GridViewRow gvr in gvList.Rows)
{
object obj2 = gvList.DataKeys[gvr.RowIndex].Value;
if (((obj2 == null) || (obj2.ToString() == "")) || (obj2.ToString() == "Table1"))
{
for (int i = 0; i < gvList.Columns.Count; i++)
{
if (columnHeaders.Contains(gvList.Columns[i].HeaderText))
{
gvr.Cells[i].Text = "";
}
}
}
}
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值