2009-05-07 3 views
23

Я пытаюсь получить GridView ASP.NET 3.5, чтобы отображать выбранное значение как строку при отображении, и показать DropDownList, чтобы я мог выбрать значение из заданного список вариантов при редактировании. Кажется, достаточно просто?Редактирование строки Gridview - динамическое связывание с DropDownList

Мой GridView выглядит следующим образом (упрощенно):

<asp:GridView ID="grvSecondaryLocations" runat="server" 
       DataKeyNames="ID" OnInit="grvSecondaryLocations_Init" 
       OnRowCommand="grvSecondaryLocations_RowCommand" 
       OnRowCancelingEdit="grvSecondaryLocations_RowCancelingEdit" 
       OnRowDeleting="grvSecondaryLocations_RowDeleting" 
       OnRowEditing="grvSecondaryLocations_RowEditing" 
       OnRowUpdating="grvSecondaryLocations_RowUpdating" > 
<Columns> 
    <asp:TemplateField> 
     <ItemTemplate> 
       <asp:Label ID="lblPbxTypeCaption" runat="server" 
           Text='<%# Eval("PBXTypeCaptionValue") %>' /> 
     </ItemTemplate> 
     <EditItemTemplate> 
         <asp:DropDownList ID="ddlPBXTypeNS" runat="server" 
           Width="200px" 
           DataTextField="CaptionValue" 
           DataValueField="OID" /> 
     </EditItemTemplate> 
    </asp:TemplateField> 
</asp:GridView> 

Сетка получает отображается OK, если не в режиме редактирования - выбранный тип АТС показывает его значение в жерех: контроль Label. Не удивительно.

Загрузите список значений для DropDownList в локальный элемент с именем _pbxTypes в событии OnLoad формы. Я проверил это - он работает, значения есть.

Теперь моя задача: когда сетка переходит в режим редактирования для определенной строки, мне нужно связать список УАТС, хранящийся в _pbxTypes.

достаточно просто, я думал - просто захватить выпадающий список объектов в RowEditing события и приложить список:

protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; 

    DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 

Trouble - я никогда не получить ничего назад от FindControl звонка - кажется, что ddlPBXTypeNS не существует (или не может быть найдено).

Что мне не хватает? Должно быть, это что-то действительно глупое .... но до сих пор, все мои Googling, чтение на элементах управления GridView и запросы друзей не помогли.

Кто может обнаружить недостающее звено? ;-)

ответ

27

Довольно легко ... Вы делаете это неправильно, потому что к этому событию управления не существует:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && 
     (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
    { 
     // Here you will get the Control you need like: 
     DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); 
    } 
} 

То есть, он будет действителен только для DataRow (фактически строка с данными), и если она находится в Редактировать режим ... потому что вы редактируете только одну строку за раз. e.Row.FindControl("ddlPBXTypeNS") найдет только тот элемент управления, который вы хотите.

+1

Tricky .... Я получаю это событие, но RowState - «Alternate | Edit» - поэтому ваш IF никогда не будет правдой :-) –

+0

OK, я изменил ваш, если для проверки установленного бита «Изменить» (игнорируя любые другие биты, которые могут быть установлены), и теперь это работает как шарм! Спасибо куче !! –

+0

просто изменил код :) – balexandre

1

Я использую ListView вместо GridView в 3.5. Когда пользователь хочет изменить, я установил выбранный элемент выпадающего списка в значение, выходящее из этого столбца для записи. Я могу получить доступ к выпадающему списку события ItemDataBound. Вот код:

protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    // This stmt is used to execute the code only in case of edit 
    if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) 
    { 
     ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); 
     ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); 
    } 
} 
+0

это не список является GridView! – balexandre

+0

точно - и я действительно не хочу менять его, чтобы заставить его работать, если вообще возможно ..... спасибо в любом случае! –

+1

balexandre ... Я уже упоминал о нем НЕ-gridview ... это был просто FYI, а не soln ... будет лучше, если вы, ребята, научитесь давать -ve указывает на «неправильные ответы», а не на другие solns или fyis ' –

0

Вы можете использовать SelectedValue:

<EditItemTemplate> 
    <asp:DropDownList ID="ddlPBXTypeNS" 
         runat="server" 
         Width="200px" 
         DataSourceID="YDS" 
         DataTextField="CaptionValue" 
         DataValueField="OID" 
         SelectedValue='<%# Bind("YourForeignKey") %>' /> 
    <asp:YourDataSource ID="YDS" ...../> 
</EditItemTemplate> 
1
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 
0

Проверенный answer from balexandre отлично работает. Но это создаст проблему, если она адаптирована к некоторым другим ситуациям.

Я использовал его, чтобы изменить значение двух контрольных меток - lblEditModifiedBy и lblEditModifiedOn - когда я редактировал строку, так что правильное ModifiedBy и ModifiedOn будут сохранены в БД на «Update».

Когда я нажал кнопку «Обновить», в событии RowUpdating он показал новые значения, введенные мной в список OldValues.При обновлении базы данных мне нужны были истинные «старые значения» как значения Original_. (Там в ObjectDataSource прилагается к GridView.)

Исправление для этого используется код balexandre, но в измененном виде в gv_DataBound события:

protected void gv_DataBound(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in gv.Rows) 
    { 
     if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
     { 
      // Here you will get the Control you need like: 
      ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; 
      ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); 
     } 
    } 
} 
-1
<asp:GridView ID="GridView1" runat="server" PageSize="2" AutoGenerateColumns="false" 
      AllowPaging="true" BackColor="White" BorderColor="#CC9966" BorderStyle="None" 
      BorderWidth="1px" CellPadding="4" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" 
      OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
      OnRowDeleting="GridView1_RowDeleting"> 
      <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
      <RowStyle BackColor="White" ForeColor="#330099" /> 
      <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
      <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
      <Columns> 
      <asp:TemplateField HeaderText="SerialNo"> 
      <ItemTemplate> 
      <%# Container .DataItemIndex+1 %>.&nbsp 
      </ItemTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollNo"> 
        <ItemTemplate> 
         <%--<asp:Label ID="lblrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="SName"> 
        <ItemTemplate> 
        <%--<asp:Label ID="lblsname" runat="server" Text='<%#Eval("SName")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtsname" runat="server" Text='<%#Eval("SName")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="C"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblc" runat="server" Text='<%#Eval ("C") %>'></asp:Label>--%> 
         <asp:TextBox ID="txtc" runat="server" Text='<%#Eval ("C") %>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Cpp"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblcpp" runat="server" Text='<%#Eval ("Cpp")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtcpp" runat="server" Text='<%#Eval ("Cpp")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Java"> 
        <ItemTemplate> 
         <%-- <asp:Label ID="lbljava" runat="server" Text='<%#Eval ("Java")%>'> </asp:Label>--%> 
         <asp:TextBox ID="txtjava" runat="server" Text='<%#Eval ("Java")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Edit" ShowHeader="False"> 
        <EditItemTemplate> 
         <asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" 
          CommandName="Update"></asp:LinkButton> 
         <asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" 
          CommandName="Cancel"></asp:LinkButton> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" 
          Text="Edit"></asp:LinkButton> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" /> 
       <asp:CommandField HeaderText="Select" ShowSelectButton="True" ShowHeader="True" /> 
      </Columns> 
     </asp:GridView> 
     <table> 
      <tr> 
       <td> 
        <asp:Label ID="lblrollno" runat="server" Text="RollNo"></asp:Label> 
        <asp:TextBox ID="txtrollno" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblsname" runat="server" Text="SName"></asp:Label> 
        <asp:TextBox ID="txtsname" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblc" runat="server" Text="C"></asp:Label> 
        <asp:TextBox ID="txtc" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblcpp" runat="server" Text="Cpp"></asp:Label> 
        <asp:TextBox ID="txtcpp" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lbljava" runat="server" Text="Java"></asp:Label> 
        <asp:TextBox ID="txtjava" runat="server"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" /> 
        <asp:Button ID="Reset" runat="server" Text="Reset" OnClick="Reset_Click" /> 
       </td> 
      </tr> 
     </table> 
+2

. Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных, ** пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

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

  • Нет связанных вопросов^_^