如何在ASP.Net GridView中组合TemplateFields?

时间:2011-10-02 03:48:45

标签: asp.net

每个人

在GridView中组合单元格时有一个问题。我知道如何组合BoundField单元格,但我不知道如何在asp.net GridView中组合TemplateField单元格。

编辑:

也许我没有清楚地提出我的问题而且我很抱歉。我的问题是我使用GridView来绑定来自db的数据,并且有一个名为UserName的字段,一个用户在数据库中有几条记录,所以我想在一个单元格中组合UserName (我可以正确组合)。同样,我想对这个用户做一些操作,比如Add,Delete。所以我将这些操作放入TemplateField,但我不知道如何将TemplateFieldBoundField结合起来。我的声誉很低,所以我无法发布图片

有什么好主意吗?

抱歉我的英语不好!提前谢谢。

3 个答案:

答案 0 :(得分:0)

没有办法合并/合并字段。我想你误解了BoundFields / TemplateField。但是,您可以使用Eval()Bind()将一个或多个表达式显示/绑定到单个单元格//列中。

阅读MSDN文章:

  1. BoundField
  2. TemplateField
  3. 编辑:

      

    @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>