Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [asp.NET][C# *] BoundColumn e DataBinding (<%#)

    ho notato che nei Datagrid non e' permesso inserire i databind
    se si e' in una colonna del tipo BoundColumn
    ad esempio non e' possibile scrivere
    codice:
    <asp:BoundColumn DataField="Pippo" HeaderText="<%#PIPPO%>"></asp:BoundColumn>
    poiche BoundColumn non e' un estensione della classe Control,
    quindi non implementa l' interfaccia System.Web.UI.IDataBindingsAccessor

    volevo sapere se esiste un modo di fare il databind senza convertire il BoundColumn in TemplateColumn ..

    mi basterebbe anche un esempio di un' implementazione del'
    System.Web.UI.IDataBindingsAccessor a una BoundColumn già fatto...

  2. #2

    Re: [asp.NET][C# *] BoundColumn e DataBinding (<%#)

    Originariamente inviato da kentaromiura
    volevo sapere se esiste un modo di fare il databind senza convertire il BoundColumn in TemplateColumn ..
    Sarebbe utile capire il motivo della richiesta. In ogni caso (anche se mi verrebbe da dire che non si puo' e che la boundcolumn e' fatta solo per visualizzare automaticamente del testo e non e' capace di attaccarsi alla specifica fonte dati con il segno <%#) ti consiglio un paio di link utili
    http://tinyurl.com/oijo
    http://www.datagridgirl.com/articles.aspx
    Saluti a tutti
    Riccardo

  3. #3

    Re: Re: [asp.NET][C# *] BoundColumn e DataBinding (<%#)

    Originariamente inviato da riccardone
    Sarebbe utile capire il motivo della richiesta. In ogni caso (anche se mi verrebbe da dire che non si puo' e che la boundcolumn e' fatta solo per visualizzare automaticamente del testo e non e' capace di attaccarsi alla specifica fonte dati con il segno <%#) ti consiglio un paio di link utili
    http://tinyurl.com/oijo
    http://www.datagridgirl.com/articles.aspx
    motivo? semplice
    ho un applicazione che devo tradurre e la voce dell'Header deve essere tradotta,
    questo e' possibile farlo via attraverso codice in questo modo:
    codice:
    DataGridx.Columns[0].HeaderText = traduci(IDTrad)
    ma cio' implica che per una modifica al datagrid dovrei Rinumerare tutte le righe

    una soluzione piu' stilisticamente buona sarebbe adottare un ENUM e modificare solo l'enum ...

    il fatto e che ,appunto come dici tu una BoundControl visualizza solo testo e se la convertissi in Template
    dovrei modificare tutto il codice che fa riferimento aggiungendoci un FindControl del controllo che conterrebbe
    (cio' inoltre probabilmente aumenterebbe non di poco il Viewstate)

    la soluzione migliore e secondo me avere un BoundControl che implementa l'interfaccia sopra riportata, registrare il Tag e usare quello all'interno del DataGrid.

    cosi' il codice rimarrebbe intatto e cambierebbe solo la pagina Aspx

  4. #4
    credo che con il link all'MSDN che mi hai dato si faccia
    quello che volevo io..
    comunque e in VB VVoVe:
    mo lo traduco... poi faccio sapere!

  5. #5

    Re: Re: Re: [asp.NET][C# *] BoundColumn e DataBinding (<%#)

    Originariamente inviato da kentaromiura
    motivo? semplice
    ho un applicazione che devo tradurre e la voce dell'Header deve essere tradotta,
    Capisco la difficolta'. Per pigrizia, anche io ho sviluppato un paio di applicazioni multilingua in cui stranamente gli header delle colonne sono neanche in italiano ma in romagnolo
    Cmq, googleggiando un po' in giro si trovano delle soluzioni. In particolare, non ho cercato molto xo' una delle prime che ho trovato segue alcuni "semplici" passaggi.
    Definisce una interfaccia IMultilingual.... che contiene solo una proprieta' testo.
    Crea una custom boundcolumn che eredita da System.Web.UI.WebControls.BoundColumn e implemente l'interfaccia.
    Nell'evento OnPreRender della datagrid nel caso in cui l'item processato e' del tipo IMultilingual... assegna alla proprieta' il testo tradotto.
    Naturalmente il tizio poi dice che il tutto non funziona xo' non mi sembra male.
    l'esempietto
    codice:
    ' ********************************************* 
    ' DataGrid 
    ' ********************************************* 
    Namespace Controls 
        Public Class DataGrid 
            Inherits System.Web.UI.WebControls.DataGrid 
    
            Protected Overrides Sub OnPreRender(ByVal E As EventArgs) 
                ' local variables 
                Dim objItem As DataGridColumn 
                Dim objCol As IMultilingualLabel 
                Dim objPage As MyBasePage 
    
    
                ' loop through all the columns in the datagrid so we can 
                ' perform any multilingual translations needed for column 
                ' headers 
                For Each objItem In Columns 
                    ' if the item is an apparelnet bound column, then 
                    ' we will convert it and see if we need to perform 
                    ' multilingual translation for the header 
                    If TypeOf objItem Is IMultilingualLabel Then 
                        ' convert the item to the bound column type so 
                        ' we can reference properties directly 
                        objCol = CType(objItem, IMultilingualLabel) 
    
    
                        ' if we have a label, then we need to get the 
                        ' translation from the page object that the datagrid 
                        ' resides on 
                        If objCol.LabelName <> "" _ 
                            And TypeOf Me.Page Is MyBasePage Then 
                            ' get the page type 
                            objPage = CType(Me.Page, MyBasePage) 
    
    
                            ' set the header text for the column to the 
    translation 
                            ' of the label provided by the user 
                            objItem.HeaderText = 
    objPage.LabelTranslation(objCol.LabelName) 
                        End If 
                    End If 
                Next 
    
    
                ' now call the overridden prerender so we perform all normal 
    activities 
                MyBase.OnPreRender(E) 
            End Sub 
    
    
            Public Sub New() 
                ' call the base constructor 
                MyBase.New() 
    
    
                ' set some basic properties for the grid that we commonly use in 
    ApparelNET 
                Me.AutoGenerateColumns = False 
                Me.AllowSorting = True 
                Me.ShowHeader = True 
                Me.Font.Name = "Arial" 
                Me.Font.Size = New FontUnit(11) 
                Me.HeaderStyle.CssClass = "Heading3" 
                Me.HeaderStyle.HorizontalAlign = HorizontalAlign.Center 
                Me.ItemStyle.HorizontalAlign = HorizontalAlign.Center 
                Me.ItemStyle.CssClass = "Normal" 
                Me.CellPadding = 0 
                Me.CellSpacing = 0 
                Me.BorderWidth = New Unit(0) 
            End Sub 
        End Class 
    End Namespace 
    
    ' ********************************************* 
    ' BoundColumn 
    ' ********************************************* 
    Namespace Controls 
        Public Interface IMultilingualLabel 
            ' create a single LabelName property to use 
            Property LabelName() As String 
        End Interface 
    
        Public Class BoundColumn 
            Inherits System.Web.UI.WebControls.BoundColumn 
            Implements IMultilingualLabel
    
            ' private variables 
            Private m_Label As String 
    
            Public Property LabelName() As String Implements 
    IMultilingualLabel.LabelName 
                Get 
                    ' return the the label to the caller 
                    Return m_Label 
                End Get 
                Set(ByVal Value As String) 
                    ' store the label and also get the multilingual translation 
                    ' for the label 
                    m_Label = Value 
                End Set 
            End Property 
        End Class 
    End Namespace
    In ogni caso, l'evento OnPreRender sembra essere quello da gestire. Si potrebbe provare anche a disattivare a design time l'header della datagrid e in quell'evento da codice aggiungere gli header tradotti.
    Saluti a tutti
    Riccardo

  6. #6
    ho fatto qualcosa, nel senso che non mi da piu' errore se trova <%#VARIABILE%> però se setto una proprietà tipo HeaderText='A<%#"a"%>'
    lui mi scrive A<%#"a"%> mentre se metto solo <%#"a"%> mi taglia il contenuto del Tag..

    credo che da qualche parte dovrei fare un DataBinder.eval, ma non mi capisco piu':

    ho fatto l'overloading dei metodi necessari utilizzando il Control di Mono come fonte di ispirazione...

    l'unica cosa che non capisco e come fare a riempirmi l'interfaccia che mi serve!!!


    codice:
    using System;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Collections;
    using System.Web.Util;
    using System.ComponentModel;
    
    namespace MyDataBound
    {
    	public class BindableDataBound : DataGridColumn ,System.Web.UI.IDataBindingsAccessor
    	{
    		private static readonly object DataBindingEvent = new object();
    		private EventHandlerList _events = new EventHandlerList();
    
    
    
    		public ICollection DataSource;
    		public string DataField;
    		public string DataTextField;
    		public string DataValueField;
    		private DataBindingCollection dataBindings;
    		private bool bindingContainer = true;
    		private bool _isNamingContainer = false;
    		private DataGrid _namingContainer = null;
    		private DataGrid _parent = null;
    
    
    
    
    		public DataGrid BindingContainer
    		{
    			get 
    			{
    				DataGrid container = NamingContainer;
    				return container;
    			}
    		}
    
    		public virtual DataGrid NamingContainer 
    		{
    			get
    			{
    				if (_namingContainer == null && _parent != null)
    				{
    						_namingContainer = _parent;
    				}
    				return _namingContainer;
    			}
    		}
    		  DataBindingCollection IDataBindingsAccessor.DataBindings
    		{
    			get
    			{
    				if(dataBindings == null)
    					dataBindings = new DataBindingCollection();
    				return dataBindings;
    			}
    		}
                    
    		bool IDataBindingsAccessor.HasDataBindings
    		{
    			get
    			{
    				return (dataBindings!=null && dataBindings.Count>0);
    			}
    		}
    		public override void InitializeCell(TableCell cell,int columnIndex,ListItemType itemType)
    		{
    		
    			
    			
    			base.InitializeCell(cell,columnIndex,itemType);
    			switch (itemType)
    			{
    				case ListItemType.Header:
    
    					
    					
    					if (this.dataBindings!=null &&this.dataBindings.Count>0)
    						if(this.dataBindings["HeaderText"]!=null)
    							this.HeaderText=this.dataBindings["HeaderText"].ToString();
    
    					cell.Text = this.HeaderText;
    					break;
    				case ListItemType.Item:
    				case ListItemType.AlternatingItem:
    					cell.DataBinding += new EventHandler(this.ItemDataBinding);
    					break;
    				case ListItemType.EditItem:
    					cell.DataBinding += new EventHandler(this.EditItemDataBinding);
    					cell.Controls.Add(new TextBox());
    					break;
                             
    			}
    		}
              
    		private void ItemDataBinding(object sender,EventArgs e)
    		{
    			TableCell cell = sender as TableCell;
    			if (cell == null)
    				throw new Exception("Table Cell was not found");
                   
    			DataGridItem gridItem = cell.NamingContainer as DataGridItem;
    			if (gridItem == null)
    				throw new Exception("Data Grid Item was not found");
                   
    			try
    			{
    				cell.Text = DataBinder.Eval(gridItem.DataItem,this.DataField).ToString();
    			}
    			catch (IndexOutOfRangeException rangeEx)
    			{
    				throw new Exception("Specified DataField was not found.");
    			}
    			catch (Exception ex)
    			{
    				throw new Exception(ex.InnerException.ToString());
    			}
    			
    			
                   
    		}
            
    		private void EditItemDataBinding(object sender,EventArgs e)
    		{
    			TableCell cell = sender as TableCell;
    			if (cell == null)
    				throw new Exception("Table Cell was not found");
                   
    			DataGridItem gridItem = cell.NamingContainer as DataGridItem;
    			if (gridItem == null)
    				throw new Exception("Data Grid Item was not found");
                   
    			TextBox txt = cell.Controls.Count == 0 ? null : cell.Controls[0] as TextBox;
    			if (txt == null)
    				throw new Exception("Text Box was not found");
                   
                             
    			
    			foreach(object item in this.DataSource)
    			{
    				if (item == null)
    				{
    					throw new Exception("Invalid DataSource");
    				}
    				else if (item.GetType() == typeof(string))
    				{
    					txt.Text=((string)item);
    				}
    					else
    				{
    					throw new Exception("Invalid DataSource");
    				}
    			}
    		}	
    		
    		public event EventHandler DataBinding //DIT
    		{
    			add
    			{				
    				Events.AddHandler(DataBindingEvent, value);
    			}
    			remove
    			{
    				Events.RemoveHandler(DataBindingEvent, value);
    			}
    		}
    		
    
    		protected EventHandlerList Events //DIT
    		{
    			get
    			{
    				if (_events == null)
    				{
    					_events = new EventHandlerList();
    				}
    				return _events;
    			}
    		}
    
    
    		
    		
    		
    		public BindableDataBound():base()
    			{
    
    			
    				//
    				// TODO: Add constructor logic here
    				//
    		
    		}
    	}
    }

  7. #7

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.