2011-12-19 35 views
1

は、私が何をしたいのかGridViewのItemTemplateにDropDownListの操作

//Fill Array 
private ArrayList GetDummyData() 
    { 
     ArrayList arr = new ArrayList(); 

      arr.Add(new ListItem("Item1", "1")); 
      arr.Add(new ListItem("Item2", "2")); 
      arr.Add(new ListItem("Item3", "3")); 

     return arr; 
    } 

//Fill dropdownlist 
private void FillDropDownList(DropDownList ddl) 
    { 
     ArrayList arr = GetDummyData(); 

     foreach (ListItem item in arr) 
     { 
      ddl.Items.Add(item); 
     } 
    } 

は、GridViewの中asssume ..ですDropDownListコントロールは、アレイを通じて満たされている (すべての行に制限されている)私は私のGridViewのドロップダウンリストをテンプレート化していると仮定します行[1]残りのみ2つのオプションが存在する行のように[0] iが、「アイテム1」を選択し - >「アイテム2」およびITEM3"

ヘルプははるかに高く評価されているが:)

+0

'行[ 0] 'と' row [1] 'は1つの行の列か異なる行(' rows [0] ')ですか? –

+0

異なる行..同じ列..(ドロップダウンリスト項目templatがある列) – rofans91

答えて

2

あなたができましたRowDataBoundイベントを処理してください。

は、たとえば(テストしていない、DataSourceをasssumingはDataTableのであり、あなたのDropDownListコントロールのIDはddlです):

void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
    var thisRow = (DataRowView)e.Row.DataItem; 
    var source = thisRow.DataView; 
    var lastRowIndex = e.Row.DataItemIndex -1; 
    DataRowView lastRow = null; 
    var ddl = (DropDownList)e.Item.FindControl("ddl"); 
    DropDownList ddlLast = null; 
    if(lastRowIndex>=0){ 
     lastRow = source[lastRowIndex]; 
     ddlLast = (DropDownList)((GridView)sender).Rows[lastRowIndex].FindControl("ddl"); 
     //remove the items of this ddl according to the items of the last dll 
    } 
    } 
} 

はあなたが有効にページングした場合、このサンプルが動作しないことを考慮すべきです、 Rowsプロパティは現在のページのGridViewRowsのみを返すためです。

編集:たぶんより良いアプローチは、DropDownListののSelectedIndexChangedイベントを処理し、任意の以下のドロップダウンのITEMLISTを更新することです:

protected void DdlSelected(object sender, EventArgs e) 
{ 
    var ddl = (DropDownList)sender; 
    var row = (GridViewRow)ddl.NamingContainer; 
    var grid = (GridView)row.NamingContainer; 
    var index = row.RowIndex + 1; 
    while (index < grid.Rows.Count) { 
     var nextRow = grid.Rows[index]; 
     var nextDdl = (DropDownList)nextRow.FindControl("ddl"); 
     nextDdl.Items.Clear(); 
     foreach (ListItem item in getDllSource()) { 
      if (ddl.SelectedItem == null || !ddl.SelectedItem.Equals(item)) { 
       nextDdl.Items.Add(item); 
      } 
     } 
     index += 1; 
    } 
} 

getDllSourceは機能に従っているのに対し:

private List<ListItem> getDllSource() 
{ 
    List<ListItem> items = new List<ListItem>(); 
    ListItem item = new ListItem("Item1", "1"); 
    items.Add(item); 
    item = new ListItem("Item2", "2"); 
    items.Add(item); 
    item = new ListItem("Item3", "3"); 
    items.Add(item); 
    return items; 
} 
+0

ありがとうございました。選択されたインデックスの更新項目リストが変更されました。非常に良いアイデアです。まず、このアイデアを自分のコードに調整しようとします。 。:) – rofans91

+0

ねえ、それは完全に働いている.. thxそんなに:) – rofans91

関連する問題