2013-11-12 2 views
0

У меня есть вид сетки, в котором на основе определенного значения из моего запроса на базу данных я хочу отображать различные типы элементов управления под столбцами Score1 и Score2. Это может варьироваться между отметкой, меткой, текстовым полем, простым значением или гиперссылкой.Отображать различные элементы управления на ячейке Gridview на основе данных конкретных ячеек

Мой случай использования следующий: если значение score1 пустое/NULL, отобразите текстовое поле, если оно не отобразите ссылку, в противном случае отобразите некоторые другие элементы управления ect .... так что на столбце оценка 1, i может иметь текстовое поле в одной строке, ссылку на другую строку.

enter image description here

Я пытался добавить TemplateField/ITemplate в коде позади динамически добавлять столбцы score1 и score2. Однако я могу сделать это только в Page_Load(), и столбец может содержать только один элемент управления. Любой указатель на то, как я должен подходить к этому?

+4

Существует множество различных подходов к решению этой проблемы. Можно было бы поместить все возможные элементы управления в столбец в определении gridview (aspx page), а затем показать и использовать только те, которые вам нужны. Второй может состоять в том, чтобы определить разные столбцы с одним элементом управления, а затем использовать/показать только нужный столбец. Третьим может быть создание элементов управления «на лету» в существующей колонке. Вероятно, есть и другие, о которых я даже не думаю. –

+0

Ваше первое предложение - самое простое, в котором, я думаю, я поставил весь контроль с их идентификатором, и посмотрю на них и спрячу все, кроме одного. Тем не менее, я действительно хочу узнать «создать контроль на лету», он кажется самым сложным, но в то же время он меня интригует ... проблема заключается в том, как его кодировать :), поскольку это то, что я пытался делать в течение последних 2 часов ... – Fylix

+0

Я хотел бы добавить один пользовательский элемент управления динамически в один столбец gridview с несколькими строками, в зависимости от условия (чередующийся между 10 различными элементами управления), но я терпел неудачу. Чтобы лучше понять динамические элементы управления, я узнал, что часто лучше не использовать динамические элементы управления, если у вас нет очень веской причины. Хорошее чтение: TRULY Понимание динамических элементов управления - https://weblogs.asp.net/infinitiesloop/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_ – Doreen

ответ

1

Вы можете использовать RowDataBound событие в GridView & добавить элементы управления динамически. Только нижняя сторона - это много случаев, если/операторы переключения & с указанием индекса ячейки

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

Вы можете использовать привязку.

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

С этим необходимо будет также релейный Command класс, который находится здесь http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030

EDIT 1:

Вы бы на самом деле хотите, 2-полосные связывания на первом способе, если Вы желаете чтобы иметь возможность изменить счет.

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

Следует отметить, что с этим вам придется привязать свой контроль к окну, которое может найти ViewModel и/или иметь контекст данных, чтобы привязка знала, где он указывает. – Recursor

Смежные вопросы