あなたができました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] 'と' row [1] 'は1つの行の列か異なる行(' rows [0] ')ですか? –
異なる行..同じ列..(ドロップダウンリスト項目templatがある列) – rofans91