根据特定的单元格数据在Gridview Cell上显示不同的控件

时间:2013-11-12 17:09:12

标签: c# asp.net gridview

我有一个网格视图,根据我的数据库查询中的某些值,我想在Score1和Score2列下显示不同类型的控件。这可以在复选标记,标签,文本框,简单值或超链接之间进行任何操作。

我的用例如下:如果score1值为空/ NULL,则显示文本框,如果不是则显示链接,否则显示一些其他控件等....所以在列得分1上,我可能在一行上有一个文本框,在另一行上有一个链接。

enter image description here

我试图在后面的代码中添加TemplateField / Itemplate来动态添加列score1和score2。但是,我只能在Page_Load()中执行此操作,并且该列只能包含一个控件。关于我应该如何处理的任何指针?

2 个答案:

答案 0 :(得分:2)

您可以使用绑定。

Text="{Binding ScoreToPrint, Mode=OneWay}"

然后你必须有一个分数可以绑定的属性。

public String ScoreToPrint
{
    get { return _scoreToPrint }
}

或者,您可以在抽象的View Model Base中使用方法和调用来获取它。

public ICommand PrintText
        {
            get
            {
                if (_printText == null)
                {
                    _printText = new RelayCommand(p => PrintText(p as Control), p => CanPrintText(p as Control));
                }

                return _printText;
            }
        }

        protected abstract void PrintText(Control control); //Where you instantiate what it should do in a child class

        protected virtual bool CanPrintText(Control control)
        {
            return true;
        }

有了这个,你还需要在这里http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030

的中继命令类

编辑1:

如果您希望能够更改分数,您实际上希望在第一种方法上进行双向绑定。

Text="{Binding ScoreToPrint, Mode=TwoWay}"

答案 1 :(得分:1)

您可以使用gridview&的RowDataBound事件。动态添加控件。唯一不足的是if / switch语句&指定单元格索引

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // You can replace this with a switch statement
            if (DataBinder.Eval(e.Row.DataItem, "Discontinued").ToString() == "False")
            {
                TextBox txtTemp = new TextBox();
                txtTemp.Text = "I am a textbox";
                e.Row.Cells[10].Controls.Add(txtTemp);
            }
            else
            {
                // Add other controls here
            }
        }
    }