我有一个网格视图,根据我的数据库查询中的某些值,我想在Score1和Score2列下显示不同类型的控件。这可以在复选标记,标签,文本框,简单值或超链接之间进行任何操作。
我的用例如下:如果score1值为空/ NULL,则显示文本框,如果不是则显示链接,否则显示一些其他控件等....所以在列得分1上,我可能在一行上有一个文本框,在另一行上有一个链接。
我试图在后面的代码中添加TemplateField / Itemplate来动态添加列score1和score2。但是,我只能在Page_Load()中执行此操作,并且该列只能包含一个控件。关于我应该如何处理的任何指针?
答案 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
}
}
}