добавить столбец без привязки к данным в gridview программно - PullRequest
1 голос
/ 30 октября 2009

Я хочу добавить столбец в сетку просмотра на page_load ()

Это ярлык, который я хочу добавить. В моем источнике данных есть идентификатор ... но я не хочу отображать идентификатор, мне нужно найти идентификатор в моей объектной модели и заменить его именем.

Итак, мне нужен такой ярлык:

<asp:Label ID="1234" runat="server" OnDataBinding="BindName" />

Это то, что я делаю в файле ascx .. внутри TemplateField.

Я хочу сделать то же самое в программном коде позади.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 30 октября 2009

Вам необходимо создать класс, который реализует этот интерфейс ITemplate.

public class TemplateImplementation : ITemplate
{
    public void InstantiateIn(Control container)
    {
        Label label = new Label();
        label.DataBinding += Label_DataBinding;
        container.Controls.Add(label);
    }
    void Label_DataBinding(object sender, EventArgs e)
    {
        Label label = (Label)sender;
        object dataItem = DataBinder.GetDataItem(label.NamingContainer);
        string sName = /* Lookup your name using the dataitem here here */;
        label.Text = sName;
    }
}

Затем вы создаете TemplateColumn и задаете свой ItemTemplate для экземпляра этого класса.

TemplateColumn lblColumn = new TemplateColumn();
lblColumn.ItemTemplate = as;
grdMyGrid.Columns.Add(lblColumn);
0 голосов
/ 31 октября 2009

ASPX Source

 <asp:GridView ID="sampleGridView" Runat="server" DataSourceID="sampleDataSource">
    <Columns>
     <asp:TemplateField HeaderText="Territories">
        <ItemTemplate>
     <asp:Label ID="1234" runat="server"/>
        </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField HeaderText="FirstName" DataField="FirstName" 
           SortExpression="FirstName"></asp:BoundField>
        <asp:BoundField HeaderText="LastName" DataField="LastName" 
           SortExpression="LastName"></asp:BoundField>
</Columns>

C # код

void sampleGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    Label bl = (Label)e.Row.FindControl("1234");
    bl.Text= ((DataRowView) e.Row.DataItem)["ID"].ToString();
  }
}
0 голосов
/ 30 октября 2009

Для GridView существует событие RowDataBound. Используйте это. Иметь TemplateColumn в разметке для этого столбца. В событии RowDataBound сделайте что-то вроде этого (грубый пример):

      Private Sub GridView1_OnRowDataBound(ByVal sender as Object, ByVal e as EventArgs)
           If e.Row.RowType = DataControlRowType.DataRow Then
              'in this example the column in question is the 3rd column
              'unless you are doing some javascript or some css on the label, I would 
              'recommend using a literal and not label.  This is presuming there is no               
              'label or literal control in the ItemTemplate property of the TemplateColumn
              Dim lt as New Literal
              lt.Text = NameController.GetName(e.Row.DataItem("NameID")) 'your business logic layer goes here
              e.Row.Cells(2).Controls.Add(lt)
           End If
        End Sub

Кроме того, вот ссылка, которая может помочь вам в дальнейшем:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...