2015-06-11 4 views
1

Это мой код за кодом. Я хочу заполнить DropDownList, как только пользователь нажмет на редактирование, но DropDownList, который я получаю, равен null. Зачем?Невозможно заполнить DropDownList в EditItemTemplate, используя OnRowCommand

protected void SupportSchedule_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "EditRow") 
    { 
     int rowIndex = ((GridViewRow)((ImageButton) e.CommandSource).NamingContainer).RowIndex; 
     GridViewRow row = (GridViewRow)(((ImageButton) e.CommandSource).NamingContainer); 
     SupportScheduleTable.EditIndex = rowIndex; 
     shift.Enabled = true; 
     resourcedate.Enabled = true; 
     ListItemCollection c = db.fillList(); 

     DropDownList ddl1 = row.FindControl("ddlshiftmanager") as DropDownList; 
     DropDownList ddl2 = row.FindControl("ddldispatcherone") as DropDownList; 
     DropDownList ddl3 = row.FindControl("ddldispatchertwo") as DropDownList; 

     if (c != null && ddl1 != null) 
     { 
      ddl1.DataSource = c; 
      ddl2.DataSource = c; 
      ddl3.DataSource = c; 
      ddl1.DataBind(); 
      ddl2.DataBind(); 
      ddl3.DataBind(); 
     } 
     getSupportSchedule(); 
    } 
    else if (e.CommandName == "CancelUpdate") 
    { 
     //some codes here 
    } else if (e.CommandName == "UpdateRow") 
    { 
     //some codes here 
    } 
} 

// жерех код

<asp:GridView ID="SupportScheduleTable" AutoGenerateColumns="False" Width="100%" runat="server" OnRowCommand="SupportSchedule_RowCommand"> 
    <Columns> 
    <asp:TemplateField HeaderText="Shift Manager"> 
     <EditItemTemplate> 
     <asp:DropDownList ID="ddlshiftmanager" runat="server" Width="99%"></asp:DropDownList> 
     </EditItemTemplate> 
     <ItemTemplate> 
     <asp:Label ID="Label1" runat="server" Text='<%# Bind("shift_manager") %>'></asp:Label> 
     </ItemTemplate> 
     <HeaderStyle Width="32%" /> 
    </asp:TemplateField> 
    <asp:TemplateField ItemStyle-HorizontalAlign="Center"> 
     <ItemTemplate> 
     <asp:ImageButton ID="lbEdit" CssClass="btn" ImageUrl="~/Files/edit.png" CommandArgument='<%# Eval("support_schedule_id") %>' CommandName="EditRow" runat="server"></asp:ImageButton> 
     </ItemTemplate> 
     <EditItemTemplate> 
     <asp:LinkButton ID="lbUpdate" CommandArgument='<%# Eval("support_schedule_id") %>' CommandName="UpdateRow" runat="server">Update</asp:LinkButton> 
     <asp:LinkButton ID="lbCancel" CommandArgument='<%# Eval("support_schedule_id") %>' CommandName="CancelUpdate" runat="server" CausesValidation="false">Cancel</asp:LinkButton> 
     </EditItemTemplate> 
     <HeaderStyle Width="2%" /> 
    </asp:TemplateField> 
    //two dropdownlists before image button 
    </Columns> 
</GridView> 

Я просто добавил ImageButton здесь в последнем обновлении, но это мой исходный код, который не работает.

+0

Вы отправили 'e.CommandSource' в' ImageButton', но я не вижу «ImageButton» в любом месте вашего GridView. Где это? –

ответ

1

Я использовал SqlDataSource вместо добавления элементов списка со спины , и это то, что я использовал для получения выбранного значения DropDownList.

else if (e.CommandName == "UpdateRow") 
{ 
    int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex; 
    DropDownList ddlshift = (DropDownList)SupportScheduleTable.Rows[rowIndex].FindControl("ddlshiftmanager"); 
    DropDownList ddlone = (DropDownList)SupportScheduleTable.Rows[rowIndex].FindControl("ddldispatcherone"); 
    DropDownList ddltwo = (DropDownList)SupportScheduleTable.Rows[rowIndex].FindControl("ddldispatchertwo"); 
    string manager = ddlshift.SelectedValue; 
    string one = ddlone.SelectedValue; 
    string two = ddltwo.SelectedValue; 
    int supportID = Convert.ToInt32(e.CommandArgument); 
    String sh = shift.Text; 
    String date = resourcedate.Text; 
    db.updateSS(supportID, sh, manager, one, two,date); 
    SupportScheduleTable.EditIndex = -1; 
    shift.Enabled = false; 
    resourcedate.Enabled = false; 
    getSupportSchedule(); 
} 
+0

Обратите внимание, что это работает, потому что SqlDataSource связывается для вас на каждом PostBack. Таким образом, вы устанавливаете EditIndex, GridView связывается автоматически через SqlDataSource, тогда у вас есть элементы управления, которые вам нужны, когда вы наконец нажмете кнопку обновления. –

0

Ваш ответ - правильный способ справиться с проблемой, которую вы видите. Но в случае, если вы не определили фактическую причину ...

ImageButton вы нажимаете на своем ItemTemplate. DropDownList, который вы хотите связать, находится в вашем EditItemTemplate. lbEdit существует, когда вы не в режиме редактирования, но ddlshiftmanager существует только в том случае, если вы :.

Итак, исправление заключается в том, чтобы поместить GridView в режим редактирования. Обратите внимание, что это то, что вы на самом деле уже начали делать. Вам нужно установить EditIndex, повторно связать GridView, а затем снова получить строку. После этого вы будете иметь строку в режиме редактирования. Эта строка должна теперь содержать ddlshiftmanager.

protected void SupportSchedule_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "EditRow") 
    { 
     int rowIndex = ((GridViewRow)((ImageButton) e.CommandSource).NamingContainer).RowIndex; 

     // Set the index to edit 
     SupportScheduleTable.EditIndex = rowIndex; 

     // Re-bind the GridView to put it in edit mode 
     SupportScheduleTable.DataSource = /* your data source */ 
     SupportScheduleTable.DataBind(); 

     // Get the row at the index. The row will be the 
     // row reflected in edit mode. 
     GridViewRow editRow = SupportScheduleTable.Rows[rowIndex]; 

     // Find your DropDownLists in this edit row 
     DropDownList ddl1 = editRow.FindControl("ddlshiftmanager") as DropDownList; 
     DropDownList ddl2 = editRow.FindControl("ddldispatcherone") as DropDownList; 
     DropDownList ddl3 = editRow.FindControl("ddldispatchertwo") as DropDownList; 

     shift.Enabled = true; 
     resourcedate.Enabled = true; 
     ListItemCollection c = db.fillList(); 

     if (c != null && ddl1 != null) 
     { 
      ddl1.DataSource = c; 
      ddl2.DataSource = c; 
      ddl3.DataSource = c; 
      ddl1.DataBind(); 
      ddl2.DataBind(); 
      ddl3.DataBind(); 
     } 
     getSupportSchedule(); 
    } 

    // Everything else... 

} 
+0

wow благодарит за прекрасный подробный ответ! :) –

+0

привет, я попытался использовать первые четыре строки этого кода, и я получил ошибку «Индекс был вне пределов досягаемости». Должен быть неотрицательным и меньше, чем размер коллекции ». на четвертой строке, почему? : O –

+0

привет, я попытался использовать первые четыре строки этого кода, и я получил ошибку «Индекс был вне допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции». на четвертой строке, почему? : O @ j.f. –