每个人
在GridView中组合单元格时有一个问题。我知道如何组合BoundField单元格,但我不知道如何在asp.net GridView中组合TemplateField单元格。
编辑:
也许我没有清楚地提出我的问题而且我很抱歉。我的问题是我使用GridView
来绑定来自db
的数据,并且有一个名为UserName
的字段,一个用户在数据库中有几条记录,所以我想在一个单元格中组合UserName (我可以正确组合)。同样,我想对这个用户做一些操作,比如Add,Delete。所以我将这些操作放入TemplateField
,但我不知道如何将TemplateField
与BoundField
结合起来。我的声誉很低,所以我无法发布图片
有什么好主意吗?
抱歉我的英语不好!提前谢谢。
答案 0 :(得分:0)
没有办法合并/合并字段。我想你误解了BoundFields / TemplateField。但是,您可以使用Eval()
和Bind()
将一个或多个表达式显示/绑定到单个单元格//列中。
阅读MSDN文章:
编辑:
@loren:有一个名为UserName的字段,一个用户有几条记录 在数据库中。
我猜你需要使用“嵌套”网格,或者你也可以使用任何数据控件(formview,detail view或ListView)。
这是演示如何绑定嵌套数据控件的演示。
我定义了两个类 - 联系人,信息
public class Contact
{
public string Address{get;set;}
public string Phone {get;set;}
}
public class Info
{
public string UserName {get;set;}
private List<Contact> _addr=new List<Contact>();
public List<Contact> Address
{
get { return _addr; }
set { _addr = value; }
}
}
在.aspx页面(标记),
<asp:GridView
ID="GridView1"
runat="server"
AutoGenerateColumns="false"
onrowdatabound="GridView1_RowDataBound"
>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<p>
Username :
<asp:Literal
ID="UserName"
runat="server"
Text='<%#Eval("UserName") %>'
>
</asp:Literal>
</p>
<asp:GridView
ID="GridView2"
runat="server"
AutoGenerateColumns="false"
>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<p>Phone :
<asp:TextBox
runat="server"
ID="txtDetail"
Text='<%#Bind("Phone") %>'
></asp:TextBox>
</p>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
和代码隐藏(aspx.cs),
List<Info> info;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
info = new List<Info>()
{
new Info()
{
UserName="User1",
Address =
{
new Contact() { Phone="2929927", Address="Address1"},
new Contact() { Phone="2929928", Address="Address2"},
}
},
new Info()
{
UserName="User2",
Address =
{
new Contact() { Phone="2929929", Address="Address3"},
new Contact() { Phone="2929930", Address="Address4"},
}
},
};
GridView1.DataSource = info;
GridView1.DataBind();
}
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
Literal username=(Literal)e.Row.FindControl("UserName");
GridView view=(GridView)e.Row.FindControl("GridView2");
if (view != null)
{
var result = from ele in info
from add in ele.Address
where ele.UserName == username.Text
select add;
view.DataSource = result;
view.DataBind();
}
}
答案 1 :(得分:0)
你可以使用Eval作为下面的文件
<asp:TemplateField HeaderText="Header">
<ItemTemplate>
<asp:TextBox runat="server" ID="txt1" Text='<%#Bind("Phone") %>'></asp:TextBox>
<asp:TextBox runat="server" ID="txt2" Text='<%#Bind("Address") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
答案 2 :(得分:0)
如果可能,您可以更新源类型。
例如,如果您是对象数据源和这样的模型:
[DataObject]
public class MyOds{
[DataObjectMethod(DataObjectMethodType.Select)]
public ICollection<MyModel> GetMyModels()
{
var result = new ListMyModel();
Populate(result); // load model with any method of you choice
return result;
}
}
public class MyModel{
public string Address { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string FullAddress {
get
{
return string.Format("{0} - {1} - {2}", Address, City, Country);
}
}
}
请注意FullAddress属性。我们的想法是为视图构建易于利用的属性。 ASPX可以是这样的:
<asp:TemplateField HeaderText="Header">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text="Label">
<%# Eval("FullAddress")%>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>