2015-03-04 5 views
1

У меня есть GridView с DropDownList. Элементы DropDownList необходимо установить в код позади. я проверил образцы онлайн код, и это выглядит я должен закодировать так:выпадающий список в ASP.Net GridView неправильно привязан

<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;autogeneratecolumns="False" 
onrowcommand="DG_Table_RowCommand" 
onrowdatabound="onrowdatabound"> 

    <Columns> 
    <asp:TemplateField HeaderText="Name" > 
     <ItemTemplate> 
     <asp:DropDownList ID="Name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox> 
     </ItemTemplate> 
    <asp:TemplateField HeaderText="field1" > 
     <ItemTemplate> 
     <asp:TextBox ID="field1" runat="server" Text='<%# Eval("FieldValue") %>'></asp:TextBox> 
    </ItemTemplate> 
</Columns> 
</asp:GridView> 

В коде позади:

public void onrowdatabound(object sender, GridViewRowEventArgs e) 
     { 

      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       //check if is in edit mode 
       if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
       { 

        DropDownList dropdownlist = (DropDownList)e.Row.FindControl("Name"); 
        dropdownlist.DataSource = new List<string>() { "Pete", "Jack", "Steve", "Mike", "Rob", "Jim", "Eric" }; 
        dropdownlist.DataBind(); 
       } 
      } 
     } 

При отладке, я могу видеть, что отладчик входит onrowdatabound. На данный момент e.Row.RowType == DataControlRowType.Header

Возможно, это нормально на данном этапе. Таким образом, отладчик завершает работу. Я бы ожидал, что отладчик снова войдет в onrowdatabound при попытке добавить строки к DataGrid. Как-то это не так, поэтому Datasource никогда не устанавливается и код позже пытается добавить значение в dropdownlist, который не принадлежит к dropdownlist.Items, вызывая ошибку выполнения:

Дополнительная информация: 'Name' has a SelectedValue which is invalid because it does not exist in the list of items. .

(что логично, так как dropdownlist.datasource никогда не был установлен

Когда DG_Table.DataBind() называется, есть 3 строки:.

protected void B_Fill_Fennec_Click(object sender, EventArgs e) 
     { 
      List<fennec> list_fennec = new List<fennec>() { new fennec("Pete", "dev"), new fennec("Jack", "butcher"), new fennec("Steve", "wood chopper"), }; 

      GridView1.DataSource = list_fennec.Select(x => new { Name = x.Name, FieldValue = x.Occupation }); 
      GridView1.DataBind(); 
     } 

Любая оцененная помощь

+0

ли это опечатка? или как это кодируется? style = "z-index: 1; autogeneratecolumns =" ​​False " – Thangadurai

+0

Если для каждой строки не запущено onrowdatabound, возможно, что-то не так с источником данных, который вы поставляете. Можете ли вы попробовать преобразовать результаты запроса LINQ в список и использовать это как источник данных. – Thangadurai

ответ

1

В разметке у вас есть эта недопустимая строка:

<asp:DropDownList ID="Name" runat="server" Text='<%# Bind("Name") %>'></asp:TextBox> 

Во-первых, потому что вы открываете тег DropDownList и закрываете тег TextBox. (Я предполагаю, что это ошибка при задании вопроса и изменении кода).

Во-вторых Text='<%# Bind("Name") %>' не действует там (похоже, это половина TextBox delcaration?

Я думаю, что вы пытаетесь сделать, это установить SelectedValue из Dropdown быть Name из от Datasource что-то как это:

<asp:GridView ID="DG_Table" runat="server" style="z-index: 1;autogeneratecolumns="False" 
onrowcommand="DG_Table_RowCommand" 
onrowdatabound="onrowdatabound"> 

    <Columns> 
    <asp:TemplateField HeaderText="Name" > 
     <ItemTemplate> 
     <asp:HiddenField id="hdn_Name" runat="server" value='<%# Eval("Name") %>' /> 
     <asp:DropDownList ID="Name" runat="server" /> 
     </ItemTemplate> 
    <asp:TemplateField HeaderText="field1" > 
     <ItemTemplate> 
     <asp:TextBox ID="field1" runat="server" Text='<%# Eval("FieldValue") %>'></asp:TextBox> 
    </ItemTemplate> 
</Columns> 
</asp:GridView> 

CodeBehind:

public void onrowdatabound(object sender, GridViewRowEventArgs e) 
{ 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     //check if is in edit mode 
     if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
     { 
       DropDownList dropdownlist = DropDownList)e.Row.FindControl("Name"); 
       dropdownlist.DataSource = new List<string>() { "Pete", "Jack", "Steve", "Mike", "Rob", "Jim", "Eric" }; 
       dropdownlist.DataBind(); 
       var nameField = e.Row.FindControl("hdn_Name") as HiddenField; 
       if(nameField != null) 
       { 
        dropdownlist.SelectedValue = nameField.Value; 
       } 
     } 
    } 
} 
+0

Thx для исправления. Действительно, я не соответствовал DropDownList и TextBox и должен был удалить поле «Текст». Ваше решение почти работает для меня. У меня все еще есть проблема с этой строкой: dropdownlist.SelectedValue = nameField.Value; Он всегда возвращает первый элемент списка (в данном случае Пит). Может ли что-то не так с этой линией? –

+0

Попробуйте удалить этот оператор if: 'if ((e.Row.RowState & DataControlRowState.Edit)> 0)'. Я не думаю, что это относится к бета-настройке? –

+0

Да я удалил его уже и до сих пор этот вопрос упоминается: 'код dropdownlist.SelectedValue = nameField.Value;' всегда подбирая первый элемент списка источника данных –

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