开发者

How to Combine TemplateFields in ASP.Net GridView?

开发者 https://www.devze.com 2023-04-10 15:48 出处:网络
Everyone. I have a question when combining cells in GridView. I konw how to combine BoundField cells, but I do not know how to combine TemplateField cells in asp.net GridView.

Everyone.

I have a question when combining cells in GridView. I konw how to combine BoundField cells, but I do not know how to combine TemplateField cells in asp.net GridView.

EDIT:

Perhaps I did not make my question clearly and I am sorry about that. My question is that I use GridView to bind data from db and There is a field named UserName, one user has several开发者_开发技巧 records in the db, so I want to combine UserName in one cell(i can combine it correctly). In the same way, I want to do some operation to this user such as Add, Delete. So i put these operations into TemplateField, but i do not konw how to combine TemplateField like BoundField. I have a low reputation, so i can not post images

Any good ideas?

Sorry for my poor english! Thanks in advance.


There isn't a way to merge/combine fields. I think you misunderstood the BoundFields/TemplateField. However you can use Eval() and Bind() to show/bind one or more expression into single cell//column..

Read MSDN articles:

  1. BoundField
  2. TemplateField

EDIT:

@loren : There is a field named UserName, one user has several records in the db.

I guess you need to use "nested" grid or you may also use any data control (formview, detail view or ListView).

Here is demo that shows how to bind nested data controls.

I've define two classes - Contact, Info

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; }
    }
}

In .aspx page (Markup),

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

and in code-behind (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();
    }
}


If possible, you can update the source type.

For example, if you an object data source and a model like this :

[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);
        }
    }
}

Note the FullAddress property. The idea is to build, for the view, properties easy to exploit. The ASPX can looks like this :

<asp:TemplateField HeaderText="Header">
   <ItemTemplate>
      <asp:Label ID="Label1" runat="server" Text="Label">
         <%# Eval("FullAddress")%>
      </asp:Label>                        
   </ItemTemplate>
</asp:TemplateField>


you can use Eval as bellow

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

精彩评论

暂无评论...
验证码 换一张
取 消