一个昨天问了一天CSDN都没有人会答的问题. 如何控制DataGrid编辑状态下的列的宽度.

时间:2022-07-28 21:55:10
下面一个DataGrid,  想独立控制编辑状态和非编辑状态下每列的宽度.  
 
列在非编辑状态的时候可以控制asp:Label的Width属性来控制列的宽度,  一旦编辑的时候,列宽度就改变了;    
编辑的时候,  控制asp:TextBox的width属性只是控制编辑框的宽度,  并没有控制列的宽度;  
修改headerStyle的width属性即不能控制非编辑状态的列宽度,  也不能控制编辑状态的列宽度,  这个就是在DataGrid属性编辑器里格式->列里设置里设置得到的代码  
 
请问怎样才可以独立控制编辑状态和非编辑状态下的每列宽度呢?  
 
 
<asp:DataGrid  id="MyDataGrid"  Runat="server"  Width="800px"  BackColor="#FFFDEC"  BorderColor="#9999FF"  
           CellPadding="3"  Font-Size="8pt"  HeaderStyle-BackColor="#CCFFFF"  OnEditCommand="MyDataGrid_Edit"  
           OnCancelCommand="MyDataGrid_Cancel"  OnUpdateCommand="MyDataGrid_Update"  OnDeleteCommand="MyDataGrid_Delete"  
           AutoGenerateColumns="False">  
           <HeaderStyle  BackColor="#CCFFFF"></HeaderStyle>  
           <EditItemStyle  Width="30px"></EditItemStyle>  
           <Columns>  
                       <asp:EditCommandColumn  ButtonType="LinkButton"  UpdateText="确认"  CancelText="取消"  EditText="修改">  
                                   <ItemStyle  Wrap="False"></ItemStyle>  
                       </asp:EditCommandColumn>  
                       <asp:ButtonColumn  Text="删除"  CommandName="Delete">  
                                   <HeaderStyle  Width="152px"></HeaderStyle>  <%--  这样不行,  完全看不到效果--%>  
                       </asp:ButtonColumn>  
                       <asp:TemplateColumn  HeaderText="项目编号">  
                                   <HeaderStyle  HorizontalAlign="Center"  Width="311px"></HeaderStyle><%--  也一样,  完全看不到效果--%>  
                                   <ItemTemplate>  
                                               <asp:Label  Runat="server"  Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")  %>'  ID="lbl_PrjNum"  Width="80"/>  
                                   </ItemTemplate>  
                                   <EditItemTemplate>  
                                               <asp:TextBox  Runat="server"  ID="tbx_PrjNum"  Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")%>'/>  
                                   </EditItemTemplate>  
                       </asp:TemplateColumn>  
           </Columns>  
</asp:DataGrid>  
 
 
请问怎样才可以独立控制编辑状态和非编辑状态下的每列宽度呢?

33 个解决方案

#1


试下这样可以吗

属性生成器--格式--列--选择要控制宽度的列--在右边调整宽度

#2


楼上的方法没有效果, 原贴中已经说了.

#3


编辑状态的的text太大了,怎么控制? 调整宽度不行,我用的百份比

#4


用模板列是对的,但是对于宽度的控制尽量使用css

比如
================================
css:
.CItem
{
width: 36px;
}
---------------------------------
<asp:TemplateColumn  HeaderText="项目编号">  
                                   <HeaderStyle  HorizontalAlign="Center"  cssclass="citem" ></HeaderStyle><%--  也一样,  完全看不到效果--%>  
                                   <ItemTemplate>  
                                               <asp:Label  Runat="server"  Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")  %>'  ID="lbl_PrjNum" cssclass="citem">  
                                   </ItemTemplate>  
                                   <EditItemTemplate>  
                                               <asp:TextBox  Runat="server"  ID="tbx_PrjNum" cssclass="citem" Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")%>'/>  
                                   </EditItemTemplate>  
                       </asp:TemplateColumn>

=================================

#5


方法有两种是,我记得的
1.直接在.cs里写上 e.Item.Cells[列].Width = System.Web.UI.WebControls.Unit.Pixel(大小);
或者e.Item.Cells[列].Attributs.Add()方式
2.在*.aspx页面上写列的宽度

#6


在DataGrid1_ItemDataBound事件中写以下代码:
if(e.Item.ItemType == ListItemType.EditItem)
{
if(e.Item.Controls[1].Controls[0].GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox tb = (TextBox)e.Item.Controls[1].Controls[0];
tb.Width = Unit.Parse("1.8cm");
tb.CssClass = "textbox";
tb.Text = Server.HtmlDecode(tb.Text);
}
Controls[1]为第一列;
1.8cm单位可以为px等.

#7


属性里可以控制的

#8


楼上的方法是否只能控制textbox的大小? 不能同时控制列的大小?
我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.

#9


private void dgMain_ItemDataBound(object sender, DataGridItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.EditItem)
   {
      for (int i =0; i < e.Item.Cells.Count; i++)
      {
         if (e.Item.Cells[i].Controls.Count > 0)
         {
            try
            {
                TextBox cur = (TextBox)e.Item.Cells[i].Controls[0];
                cur.Width = 30;
            }
            catch
            {

            }
         }
      }
   }
}

这段代码希望大家学习,很实用的好东东。

#10


楼上的代码只能控制TextBox的宽度. 我想在改变Textbox的宽度后, 改变DataGrid对应列的宽度应该如何设置? 我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.

#11


TextBox的width可以改变列的宽度

#12


设置为百分比看看

#13


To:  codeangel(-- 与人方便,自已方便 --) 

刚才试了,只能改变Textbox的宽度, 变成一个很宽的列, 里面有个很小的TextBox

#14


TextBox cur = (TextBox)e.Item.Cells[i].Controls[0];
cur.Width = 30;
然后再加:
e.Item.Cells[i].Width=30

#15


通常在ItemDataBound 事件里面设定

#16


private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if(e.Item.ItemType==ListItemType.EditItem)  
//状态设定。非编辑为ListItemType.Item,ListItemType.AlternatingItem:
  {
   for(int i=0;i<e.Item.Cells.Count;i++)
      {
         if(e.Item.Cells[i].Controls.Count>0)
{
try
{
TextBox t=(TextBox)e.Item.Cells[i].Controls[0];//非编辑为Label
t.Width=50;//你要的宽度
}
catch(Exception ee)
 {
 n}
}
      }
   }
}

#17


up

#18


楼上的代码只能控制TextBox的宽度. 我想在改变Textbox的宽度后, 改变DataGrid对应列的宽度应该如何设置? 我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.
我给你的方法就可以,我就是这么用的,列的宽度自动会缩小的.你自己可以试试.

#19


<asp:datagrid id="DataGrid1" runat="server" AllowPaging="True" AutoGenerateColumns="False" PageSize="3"
ShowHeader="False" AllowSorting="True" Width="100%">
<EditItemStyle ForeColor="Aqua" Width ="10%"></EditItemStyle>
............


#20


不要给datagrid设置width试试

#21


mark

#22


gz

#23


<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑"> <ItemStyle Width="10%"></ItemStyle> </asp:EditCommandColumn>
这样试过没有?

#24


改用模板好控制

#25


如 LoveCher所说,不设置DataGrid的总体width属性就可以按照hfzsjz等人的方法来解决问题, 很感谢大家的热心帮忙, 还有点小问题, 解决完就揭帖

#26


用模板的方式最合适了

#27


<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑">
<ItemStyle Wrap="False"></ItemStyle>
</asp:EditCommandColumn>

用这个,让列宽自动扩充,即不允许在列中换行

#28


忘了一点就是DataGrid的宽度和高度都不要设,这样DataGrid就可以根据数据的长度、多少来伸缩了。

#29


在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ?

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
       for(int i=0;i<e.Item.Cells.Count-1;i++)
          if(e.Item.ItemType==ListItemType.EditType)
           {
                  e.Item.Cells[i].Attributes.Add("Width", "80px")

            }   
}
你可以参考下

#30


eform自定义表单平台是一个在IE浏览器中可视化的设计软件界面的工具。无论是输入界面还是报表界面,无论是简单的输入查询还是复杂的逻辑处理。都可以由eform设计出来。 
 
     eform自定义表单平台适用于网上OA系统的自定义表单模块,工作流系统的自定义表单模块,信息管理系统方面的软件开发项目等等。 


方成eform自定义表单平台,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.

#31


有两种方法:
一、用模板列(推荐),示例如下:
<asp:TemplateColumn HeaderText="部门或职务">
<ItemStyle Width="28%"></ItemStyle>
<ItemTemplate>
<asp:Label id="Label3" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.department") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="Textbox3" CssClass="editalign" runat="server" Width="100%" Text='<%# DataBinder.Eval(Container, "DataItem.department") %>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
第二种方法,用一个过程来设置,并在datagrid绑定完成后执行它:
Sub SetEditBox(ByVal EditIndex As Integer)  '设置编辑状态下的每个文本框的宽度
        If EditIndex = -1 Then Exit Sub
        Dim dcell As New TableCell
        For Each dcell In Datagrid1.Items(EditIndex).Cells
            If dcell.HasControls Then
                If dcell.Controls(0).GetType Is GetType(TextBox) Then
                    Dim cellIndex As Integer = Datagrid1.Items(EditIndex).Cells.GetCellIndex(dcell)
                    CType(dcell.Controls(0), TextBox).Width = Datagrid1.Columns(cellIndex).ItemStyle.Width 
                 End If
            End If
        Next dcell
    End Sub
两种方法都很完美!

#32


up

#33


昨天刚做到,给你看一下
----------------------------------------------------
//动态生成Textbox
                for (int i=1;i<=4;i++) 
                {                    
                    TextBox txt = new TextBox();
                    txt.ID = "TextBox"+i.ToString();                    
                    txt.Text = e.Item.Cells[i].Text;                    
                    txt.Width=this.DataGrid1.Columns[i].HeaderStyle.Width;
                    txt.Height=16;
                    txt.CssClass="NoneBorderText";
                    txt.Attributes.Add("onblur","Update()");
                    txt.Font.Size=new FontUnit("9px");               
                    e.Item.Cells[i].Controls.Add(txt);
}

#1


试下这样可以吗

属性生成器--格式--列--选择要控制宽度的列--在右边调整宽度

#2


楼上的方法没有效果, 原贴中已经说了.

#3


编辑状态的的text太大了,怎么控制? 调整宽度不行,我用的百份比

#4


用模板列是对的,但是对于宽度的控制尽量使用css

比如
================================
css:
.CItem
{
width: 36px;
}
---------------------------------
<asp:TemplateColumn  HeaderText="项目编号">  
                                   <HeaderStyle  HorizontalAlign="Center"  cssclass="citem" ></HeaderStyle><%--  也一样,  完全看不到效果--%>  
                                   <ItemTemplate>  
                                               <asp:Label  Runat="server"  Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")  %>'  ID="lbl_PrjNum" cssclass="citem">  
                                   </ItemTemplate>  
                                   <EditItemTemplate>  
                                               <asp:TextBox  Runat="server"  ID="tbx_PrjNum" cssclass="citem" Text='<%#  DataBinder.Eval(Container.DataItem,  "项目编号")%>'/>  
                                   </EditItemTemplate>  
                       </asp:TemplateColumn>

=================================

#5


方法有两种是,我记得的
1.直接在.cs里写上 e.Item.Cells[列].Width = System.Web.UI.WebControls.Unit.Pixel(大小);
或者e.Item.Cells[列].Attributs.Add()方式
2.在*.aspx页面上写列的宽度

#6


在DataGrid1_ItemDataBound事件中写以下代码:
if(e.Item.ItemType == ListItemType.EditItem)
{
if(e.Item.Controls[1].Controls[0].GetType().ToString() == "System.Web.UI.WebControls.TextBox")
{
TextBox tb = (TextBox)e.Item.Controls[1].Controls[0];
tb.Width = Unit.Parse("1.8cm");
tb.CssClass = "textbox";
tb.Text = Server.HtmlDecode(tb.Text);
}
Controls[1]为第一列;
1.8cm单位可以为px等.

#7


属性里可以控制的

#8


楼上的方法是否只能控制textbox的大小? 不能同时控制列的大小?
我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.

#9


private void dgMain_ItemDataBound(object sender, DataGridItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.EditItem)
   {
      for (int i =0; i < e.Item.Cells.Count; i++)
      {
         if (e.Item.Cells[i].Controls.Count > 0)
         {
            try
            {
                TextBox cur = (TextBox)e.Item.Cells[i].Controls[0];
                cur.Width = 30;
            }
            catch
            {

            }
         }
      }
   }
}

这段代码希望大家学习,很实用的好东东。

#10


楼上的代码只能控制TextBox的宽度. 我想在改变Textbox的宽度后, 改变DataGrid对应列的宽度应该如何设置? 我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.

#11


TextBox的width可以改变列的宽度

#12


设置为百分比看看

#13


To:  codeangel(-- 与人方便,自已方便 --) 

刚才试了,只能改变Textbox的宽度, 变成一个很宽的列, 里面有个很小的TextBox

#14


TextBox cur = (TextBox)e.Item.Cells[i].Controls[0];
cur.Width = 30;
然后再加:
e.Item.Cells[i].Width=30

#15


通常在ItemDataBound 事件里面设定

#16


private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
 if(e.Item.ItemType==ListItemType.EditItem)  
//状态设定。非编辑为ListItemType.Item,ListItemType.AlternatingItem:
  {
   for(int i=0;i<e.Item.Cells.Count;i++)
      {
         if(e.Item.Cells[i].Controls.Count>0)
{
try
{
TextBox t=(TextBox)e.Item.Cells[i].Controls[0];//非编辑为Label
t.Width=50;//你要的宽度
}
catch(Exception ee)
 {
 n}
}
      }
   }
}

#17


up

#18


楼上的代码只能控制TextBox的宽度. 我想在改变Textbox的宽度后, 改变DataGrid对应列的宽度应该如何设置? 我现在是编辑的时候列太宽了, 如果只是缩小textbox不同时缩小列, 还是不好看.
我给你的方法就可以,我就是这么用的,列的宽度自动会缩小的.你自己可以试试.

#19


<asp:datagrid id="DataGrid1" runat="server" AllowPaging="True" AutoGenerateColumns="False" PageSize="3"
ShowHeader="False" AllowSorting="True" Width="100%">
<EditItemStyle ForeColor="Aqua" Width ="10%"></EditItemStyle>
............


#20


不要给datagrid设置width试试

#21


mark

#22


gz

#23


<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑"> <ItemStyle Width="10%"></ItemStyle> </asp:EditCommandColumn>
这样试过没有?

#24


改用模板好控制

#25


如 LoveCher所说,不设置DataGrid的总体width属性就可以按照hfzsjz等人的方法来解决问题, 很感谢大家的热心帮忙, 还有点小问题, 解决完就揭帖

#26


用模板的方式最合适了

#27


<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="更新" CancelText="取消" EditText="编辑">
<ItemStyle Wrap="False"></ItemStyle>
</asp:EditCommandColumn>

用这个,让列宽自动扩充,即不允许在列中换行

#28


忘了一点就是DataGrid的宽度和高度都不要设,这样DataGrid就可以根据数据的长度、多少来伸缩了。

#29


在Datagrid中修改数据,当点击编辑键时,数据出现在文本框中,怎么控制文本框的大小 ?

private void DataGrid1_ItemDataBound(obj sender,DataGridItemEventArgs e)
{
       for(int i=0;i<e.Item.Cells.Count-1;i++)
          if(e.Item.ItemType==ListItemType.EditType)
           {
                  e.Item.Cells[i].Attributes.Add("Width", "80px")

            }   
}
你可以参考下

#30


eform自定义表单平台是一个在IE浏览器中可视化的设计软件界面的工具。无论是输入界面还是报表界面,无论是简单的输入查询还是复杂的逻辑处理。都可以由eform设计出来。 
 
     eform自定义表单平台适用于网上OA系统的自定义表单模块,工作流系统的自定义表单模块,信息管理系统方面的软件开发项目等等。 


方成eform自定义表单平台,纯BS结构.100%开放源码.可以在 http://218.30.103.110:8080/eform/index.html 在线试用.

#31


有两种方法:
一、用模板列(推荐),示例如下:
<asp:TemplateColumn HeaderText="部门或职务">
<ItemStyle Width="28%"></ItemStyle>
<ItemTemplate>
<asp:Label id="Label3" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.department") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="Textbox3" CssClass="editalign" runat="server" Width="100%" Text='<%# DataBinder.Eval(Container, "DataItem.department") %>'>
</asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn>
第二种方法,用一个过程来设置,并在datagrid绑定完成后执行它:
Sub SetEditBox(ByVal EditIndex As Integer)  '设置编辑状态下的每个文本框的宽度
        If EditIndex = -1 Then Exit Sub
        Dim dcell As New TableCell
        For Each dcell In Datagrid1.Items(EditIndex).Cells
            If dcell.HasControls Then
                If dcell.Controls(0).GetType Is GetType(TextBox) Then
                    Dim cellIndex As Integer = Datagrid1.Items(EditIndex).Cells.GetCellIndex(dcell)
                    CType(dcell.Controls(0), TextBox).Width = Datagrid1.Columns(cellIndex).ItemStyle.Width 
                 End If
            End If
        Next dcell
    End Sub
两种方法都很完美!

#32


up

#33


昨天刚做到,给你看一下
----------------------------------------------------
//动态生成Textbox
                for (int i=1;i<=4;i++) 
                {                    
                    TextBox txt = new TextBox();
                    txt.ID = "TextBox"+i.ToString();                    
                    txt.Text = e.Item.Cells[i].Text;                    
                    txt.Width=this.DataGrid1.Columns[i].HeaderStyle.Width;
                    txt.Height=16;
                    txt.CssClass="NoneBorderText";
                    txt.Attributes.Add("onblur","Update()");
                    txt.Font.Size=new FontUnit("9px");               
                    e.Item.Cells[i].Controls.Add(txt);
}