Gridview - ссылка на новый столбец - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть gridview, который принимает данные из 3 таблиц. И у этого вида сетки также есть дополнительный столбец под названием «Роль», который не включен в базу данных. В настоящее время, не добавляя никакой логики, а просто используя findcontrol для метки «Роль», я могу показать «ML» Но, когда я добавляю логику, она вообще не появляется.

В любом случае, кто-нибудь знает, как вставить «ML» в столбец «Роль», который не найден в базе данных, но является ссылкой из другого столбца, найденного в базе данных.

Это коды, используемые для отображения «ML» в столбце роли.

protected void gridAMDisplay_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //find the Label control using FindControl and set its Text on some column value
        DataRowView row = (DataRowView)e.Row.DataItem;

        if (!DBNull.Value.Equals(row["ModuleLeader"]))
        {

            if (row["ModuleLeader"].ToString() == "ModuleStr")
            {
                Label lbl = e.Row.FindControl("lblRole") as Label;
                if (lbl != null)
                {
                    lbl.Text = "ML";
                }
            }
        }
    }
}

Эта часть кода при отключении комментария, ML может отображаться в столбце роли, в противном случае ничего не отображается. Поэтому я чувствую, что часть findcontrol работает. НО, ссылка не работает.

if (row["ModuleLeader"].ToString() == "ModuleStr")
            {

Как я уже упоминал, столбец роли не был включен ни в одну из таблиц в БД. Поэтому я добавил в эти коды.

<asp:TemplateField HeaderText="Role">
    <ItemTemplate>
        <asp:Label ID="lblRole" runat="server" Text="" />
    </ItemTemplate>
</asp:TemplateField>

Но проблема, с которой я столкнулся сейчас, заключается в том, что столбец роли не ссылается на предполагаемый столбец, который называется «Лидеры модулей»

Ответы [ 3 ]

0 голосов
/ 26 декабря 2009

Лучшая практика, по моему скромному мнению, - это создание собственного шаблона.

Вот один пример для вашего случая:

public class NotEmptyValueFromDataTemplate : System.Web.UI.Page, IBindableTemplate
{
    protected string p_DataFieldToLookAt;
    protected string p_ValueToPlaceInIfNotNull;
    protected Literal p_litControl;

    public RoleTemplate(string DataFieldToLookAt, string ValueToPlaceInIfNotNull)
    {
        this.p_DataFieldToLookAt = DataFieldToLookAt;
        this.p_ValueToPlaceInIfNotNull = ValueToPlaceInIfNotNull;
    }

    public virtual void OnInit(object sender, EventArgs e)
    { }

    #region IBindableTemplate Members

    public System.Collections.Specialized.IOrderedDictionary ExtractValues(Control container)
    {
        throw new NotImplementedException();
    }

    #endregion

    #region ITemplate Members

    public void InstantiateIn(Control container)
    {
        p_litControl = new Literal();
        p_litControl.ID = p_DataFieldToLookAt; /* we don't really care */
        p_litControl.Init += new EventHandler(OnInit);
        p_litControl.DataBinding += new EventHandler(p_litControl_DataBinding);
        container.Controls.Add(p_litControl);
    }

    void p_litControl_DataBinding(object sender, EventArgs e)
    {
        var Data = ((GridViewRow)(p_litControl.NamingContainer)).DataItem;

        string ValueFromData = Convert.ToString(DataBinder.Eval(Data, p_DataFieldToLookAt));

        if(!String.IsNullOrEmpty(ValueFromData))
            p_litControl.Text = p_ValueToPlaceInIfNotNull;
    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
    }

    #endregion
}

Затем необходимо создать экземпляр каждой строки шаблона:

protected void GridView3_Init(object sender, EventArgs e)
{
    ((TemplateField)(GridView3.Columns[/* Column Index Here*/])).ItemTemplate = new     NotEmptyValueFromDataTemplate("ModuleLeader", "ML");
}

Наконец, создайте элемент шаблона в виде сетки:

<asp:TemplateField HeaderText="Role"></asp:TemplateField>

PS: код не проверен и записан из решения

0 голосов
/ 15 января 2010

Кажется, вы хотите, чтобы столбец роли обновлялся до "ML" на основе данных, представленных в другом столбце той же строки. Почему бы просто не бросить его в XHTML?

<asp:TemplateField HeaderText="Role"> 
    <ItemTemplate> 
        <asp:Label ID="lblRole" runat="server" Text='<%# GetRoleString(Eval("ModuleLeader"))%>' /> 
    </ItemTemplate> 
</asp:TemplateField> 

Тогда в коде позади вы можете иметь метод:

string GetRoleString(string moduleLeader) 
{
     return (moduleLeader == "ModuleStr") ? "ML" : "";
}

Это произойдет при привязке данных и будет происходить только один раз в строке.

0 голосов
/ 16 сентября 2009

Вы ссылаетесь на DataItem, который нельзя использовать в DataBound, вы должны использовать OnDataBinding для реализации этого.

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