请问如何实现datagrid的某列内容只显示固定长度的一部分,超过此长度用……表示?

时间:2022-03-03 09:45:48
例如:有列名为“标题”的列有一条记录是20个字,在datagrid中,我只想显示前十个字,然后打省略号,请问怎么解决??

24 个解决方案

#1


估计只能通过程序实现了吧,你把字符串用函数先处理成你想要的形式,列绑定到函数的返回值。

#2


up

#3


如果照上面仁兄说的,那我怎么控制它的循环,因为datagrid的循环我们是没有操作它的,例如有10条记录,它是不需要我们来控制循环的。

#4


什么控制循环不控制循环的。如果只有10条记录就写一个:
for(int i = 0; i<10; i++)
{
    判断字段的Text的长度是否大于10,太于就把它后面的变为"....".
}
还有什么问题吗?有问题最好说明确一点。

#5


<asp:TemplateColumn HeaderText="Subject">
<ItemTemplate>
<%# TransformSubject(DataBinder.Eval(Container.DataItem, "Subject")) %>
</ItemTemplate>
</asp:TemplateColumn>

.aspx.cs中:

public string TransformSubject(object subject)
{
   string strSubject = subject.ToString();
   if (strSubject.Length <= 20)
   {
       return strSubject;
    }
   else
    {
       strSubject = strSubject.SubString(0, 20) + "....";
       return strSubject;
     }
}

#6


可以自定义datatable,进行截取

然后榜定

或者

在itemdatabound中街区

#7


我是说datagrid控件几个属性设置好就行了,更本不用对它显示记录进行编程,如果用for循环来判断,就要编程,但是这种方式我从来没用过,我对asp.net很差,各位大虾能不能来点代码示例??

#8


同意楼上的,在itemdatabound中截取吧,挺方便的,连该列的控件都可以改变,还有什么办不了的呢

#9


谢谢各位,先试试。

#10


还是昨天的问题,我确实不知道怎么加上去,我的列是:<asp:HyperLinkColumn Target="mainFrame" DataNavigateUrlField="id" DataNavigateUrlFormatString="show.aspx?id={0}" DataTextField="新闻标题"
</asp:HyperLinkColumn>

#11


同意sping_ok和allanli,用TemplateColumn,在datagrid的itemdatabound事件中对string进行截取
例如:
 strTmp = e.Item.Cells(8).Text  '取得第九列里的string
 If Len(strTmp) > 14 Then       '如果它的长度大于15,就截取再补"..."
   strTmp = Left(strTmp, 14) & "..."
 End If

#12


谁有类似的代码,发一段好吗?解决马上给分,已经没时间研究了,急!!
要是:<asp:HyperLinkColumn Target="mainFrame" DataNavigateUrlField="id" DataNavigateUrlFormatString="show.aspx?id={0}" DataTextField="新闻标题"
</asp:HyperLinkColumn>
的代码,文本文件和cs文件的代码都发一下,先谢了!

#13


奇怪,我已经将代码贴在上面了,你还要什么代码啊?你改一下我代码中的字段名就可以啦。

#14


spring_ok(SpringDotNet) 说的就是最好的解决办法

#15


各位都是高手,就是我太笨,难道你们的HyperLinkColumn可以绑定DataBinding,我就不行吗?
TemplateColumn这个我也能用,我问的是这个HyperLinkColumn????
怎么把类似<%# TransformSubject(DataBinder.Eval(Container.DataItem, "标题")) %>绑定上去????

#16


可以在CS文件中写DataGrid1.ItemDataBound事件,
给段VB的代码进行参考:
 If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            e.Item.Cells(0).Text = formatstring(mytable.Rows(e.Item.ItemIndex)("orgid"))
        End If

#17


1、
public MemoData GetAwake(DateTime datetime,int iBound,int iNowHour,string UserID,int iAbbreviate)
{
string strDateTime=ChangeTimeToString(datetime);
//if(grdiAbbreviate)
string SqlQuery="SELECT MemoID, UserID, LEFT(Title,"+iAbbreviate+")+'...' AS Title, BodyText, BeginTime, EndTime, MemoPlace, Modified,Created FROM pmMemo WHERE (CONVERT(varchar(10), BeginTime) = '"+strDateTime+"') AND (DATEPART(Hour, BeginTime) >= "+iNowHour+") AND (DATEPART(Hour, BeginTime) <= "+(iBound+iNowHour)+" AND UserID="+UserID+") order by BeginTime";
return FillMemoData(SqlQuery,"","");
}


2、
public MemoData GetAwake(DateTime datetime,int iBound,int iNowHour,string UserID,int iAbbreviate,DataGrid grd){
string strDateTime=ChangeTimeToString(datetime);
string SqlQuery="SELECT MemoID, UserID, Title, BodyText, BeginTime, EndTime, MemoPlace, Modified,Created FROM pmMemo WHERE (CONVERT(varchar(10), BeginTime) = '"+strDateTime+"') AND (DATEPART(Hour, BeginTime) >= "+iNowHour+") AND (DATEPART(Hour, BeginTime) <= "+(iBound+iNowHour)+" AND UserID="+UserID+") order by BeginTime";
MemoData memodata=FillMemoData(SqlQuery,"","");
grd.DataSource=memodata.Tables[0];
foreach(DataRow dr in memodata.Tables[0].Rows){
if(dr[2].ToString().Length>=iAbbreviate){
dr[2]=dr[2].ToString().Substring(0,iAbbreviate)+"...";
}
}
return memodata; 
}

两种都可以!后一个是如果没有超过你的预定值将回显示所用否则按照你预定的截取!

#18


请参与的各位看清楚,我是需要有联接的这种列:HyperLinkColumn

不是其他如:BoundColumn、TemplateColumn等我都能用spring_ok(SpringDotNet) 的方法和ItemDataBound方式,
惟独用HyperLinkColumn不能截取,如果你说的不是HyperLinkColumn
就免开你尊口!!!
谢谢合作!!!

#19


唉,瞧一个简单的问题都搞成了这样。

在DataGrid的ItemDataBound事件里加入:
if (e.Item.ItemIndex >= 0)
{
HyperLink link = (HyperLink)e.Item.Cells[0].Controls[0];
if (link.Text.Length > 3)
{
link.Text = link.Text.Substring(0, 3) + "...";
}
}

#20


oh,你需要把3改成10

#21


我想和你要的列类型没有什么关系!我写的代码很清楚!我是在DataTable中截取的和DataGrid没什么关系!你用什么列就更没有关系了!里面有一些我自己的对象希望没有影响你的理解!这是从我的程序中原样Copy的!我现在用得好好的!我的那一列和你的要求是一样的,但我还是要说和列的性质没有关系!好好看看!希望可以帮上忙!

#22


对datagrid绑定之前的数据集进行处理啊 for eachRow .....

#23


是的!绑定之前处理DataTable

#24


up

#1


估计只能通过程序实现了吧,你把字符串用函数先处理成你想要的形式,列绑定到函数的返回值。

#2


up

#3


如果照上面仁兄说的,那我怎么控制它的循环,因为datagrid的循环我们是没有操作它的,例如有10条记录,它是不需要我们来控制循环的。

#4


什么控制循环不控制循环的。如果只有10条记录就写一个:
for(int i = 0; i<10; i++)
{
    判断字段的Text的长度是否大于10,太于就把它后面的变为"....".
}
还有什么问题吗?有问题最好说明确一点。

#5


<asp:TemplateColumn HeaderText="Subject">
<ItemTemplate>
<%# TransformSubject(DataBinder.Eval(Container.DataItem, "Subject")) %>
</ItemTemplate>
</asp:TemplateColumn>

.aspx.cs中:

public string TransformSubject(object subject)
{
   string strSubject = subject.ToString();
   if (strSubject.Length <= 20)
   {
       return strSubject;
    }
   else
    {
       strSubject = strSubject.SubString(0, 20) + "....";
       return strSubject;
     }
}

#6


可以自定义datatable,进行截取

然后榜定

或者

在itemdatabound中街区

#7


我是说datagrid控件几个属性设置好就行了,更本不用对它显示记录进行编程,如果用for循环来判断,就要编程,但是这种方式我从来没用过,我对asp.net很差,各位大虾能不能来点代码示例??

#8


同意楼上的,在itemdatabound中截取吧,挺方便的,连该列的控件都可以改变,还有什么办不了的呢

#9


谢谢各位,先试试。

#10


还是昨天的问题,我确实不知道怎么加上去,我的列是:<asp:HyperLinkColumn Target="mainFrame" DataNavigateUrlField="id" DataNavigateUrlFormatString="show.aspx?id={0}" DataTextField="新闻标题"
</asp:HyperLinkColumn>

#11


同意sping_ok和allanli,用TemplateColumn,在datagrid的itemdatabound事件中对string进行截取
例如:
 strTmp = e.Item.Cells(8).Text  '取得第九列里的string
 If Len(strTmp) > 14 Then       '如果它的长度大于15,就截取再补"..."
   strTmp = Left(strTmp, 14) & "..."
 End If

#12


谁有类似的代码,发一段好吗?解决马上给分,已经没时间研究了,急!!
要是:<asp:HyperLinkColumn Target="mainFrame" DataNavigateUrlField="id" DataNavigateUrlFormatString="show.aspx?id={0}" DataTextField="新闻标题"
</asp:HyperLinkColumn>
的代码,文本文件和cs文件的代码都发一下,先谢了!

#13


奇怪,我已经将代码贴在上面了,你还要什么代码啊?你改一下我代码中的字段名就可以啦。

#14


spring_ok(SpringDotNet) 说的就是最好的解决办法

#15


各位都是高手,就是我太笨,难道你们的HyperLinkColumn可以绑定DataBinding,我就不行吗?
TemplateColumn这个我也能用,我问的是这个HyperLinkColumn????
怎么把类似<%# TransformSubject(DataBinder.Eval(Container.DataItem, "标题")) %>绑定上去????

#16


可以在CS文件中写DataGrid1.ItemDataBound事件,
给段VB的代码进行参考:
 If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            e.Item.Cells(0).Text = formatstring(mytable.Rows(e.Item.ItemIndex)("orgid"))
        End If

#17


1、
public MemoData GetAwake(DateTime datetime,int iBound,int iNowHour,string UserID,int iAbbreviate)
{
string strDateTime=ChangeTimeToString(datetime);
//if(grdiAbbreviate)
string SqlQuery="SELECT MemoID, UserID, LEFT(Title,"+iAbbreviate+")+'...' AS Title, BodyText, BeginTime, EndTime, MemoPlace, Modified,Created FROM pmMemo WHERE (CONVERT(varchar(10), BeginTime) = '"+strDateTime+"') AND (DATEPART(Hour, BeginTime) >= "+iNowHour+") AND (DATEPART(Hour, BeginTime) <= "+(iBound+iNowHour)+" AND UserID="+UserID+") order by BeginTime";
return FillMemoData(SqlQuery,"","");
}


2、
public MemoData GetAwake(DateTime datetime,int iBound,int iNowHour,string UserID,int iAbbreviate,DataGrid grd){
string strDateTime=ChangeTimeToString(datetime);
string SqlQuery="SELECT MemoID, UserID, Title, BodyText, BeginTime, EndTime, MemoPlace, Modified,Created FROM pmMemo WHERE (CONVERT(varchar(10), BeginTime) = '"+strDateTime+"') AND (DATEPART(Hour, BeginTime) >= "+iNowHour+") AND (DATEPART(Hour, BeginTime) <= "+(iBound+iNowHour)+" AND UserID="+UserID+") order by BeginTime";
MemoData memodata=FillMemoData(SqlQuery,"","");
grd.DataSource=memodata.Tables[0];
foreach(DataRow dr in memodata.Tables[0].Rows){
if(dr[2].ToString().Length>=iAbbreviate){
dr[2]=dr[2].ToString().Substring(0,iAbbreviate)+"...";
}
}
return memodata; 
}

两种都可以!后一个是如果没有超过你的预定值将回显示所用否则按照你预定的截取!

#18


请参与的各位看清楚,我是需要有联接的这种列:HyperLinkColumn

不是其他如:BoundColumn、TemplateColumn等我都能用spring_ok(SpringDotNet) 的方法和ItemDataBound方式,
惟独用HyperLinkColumn不能截取,如果你说的不是HyperLinkColumn
就免开你尊口!!!
谢谢合作!!!

#19


唉,瞧一个简单的问题都搞成了这样。

在DataGrid的ItemDataBound事件里加入:
if (e.Item.ItemIndex >= 0)
{
HyperLink link = (HyperLink)e.Item.Cells[0].Controls[0];
if (link.Text.Length > 3)
{
link.Text = link.Text.Substring(0, 3) + "...";
}
}

#20


oh,你需要把3改成10

#21


我想和你要的列类型没有什么关系!我写的代码很清楚!我是在DataTable中截取的和DataGrid没什么关系!你用什么列就更没有关系了!里面有一些我自己的对象希望没有影响你的理解!这是从我的程序中原样Copy的!我现在用得好好的!我的那一列和你的要求是一样的,但我还是要说和列的性质没有关系!好好看看!希望可以帮上忙!

#22


对datagrid绑定之前的数据集进行处理啊 for eachRow .....

#23


是的!绑定之前处理DataTable

#24


up