【问题标题】:Display different control on Gridview Cell based on specific cell data根据特定的单元格数据在Gridview Cell上显示不同的控件
【发布时间】:2013-11-12 17:09:11
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题有很多不同的方法。一种可能是将所有可能的控件放在 gridview 定义(aspx 页面)的列中,然后仅显示和使用您需要的控件。第二个可能是定义不同的列,每个列都有一个控件,然后只使用/显示您需要的列。第三种可能是在现有列中“动态”创建控件。可能还有其他我什至现在都没有想到的。
  • 您的第一个建议是最简单的,我认为我将所有控件与他们的 ID 一起放入并查找它们并隐藏除一个之外的所有控件。但是,我真的很想学习“动态创建控制”,它似乎是最复杂的,但同时它也让我很感兴趣......问题是如何编码它:)因为我正在尝试过去 2 小时要做的事情...
  • 我想根据条件(在 10 个不同的控件之间交替)在具有多行的 gridview 的一列中动态添加一个用户控件,但我失败了。为了更好地理解动态控件,我了解到除非您也有充分的理由,否则最好不要使用动态控件。好读物:真正了解动态控制 - weblogs.asp.net/infinitiesloop/…2800_Part-1_2900

标签: c# asp.net gridview


【解决方案1】:

您可以使用绑定。

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

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

public String ScoreToPrint
{
    get { return _scoreToPrint }
}

或者,您可以通过抽象视图模型库中的方法和调用来获取它。

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

【讨论】:

  • 需要注意的是,你必须将你的控件绑定到一个可以找到 ViewModel 和/或具有数据上下文的窗口,以便绑定知道它指向的位置。
【解决方案2】:

您可以使用 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
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多