Обновление gridview для asp.net - PullRequest
       2

Обновление gridview для asp.net

0 голосов
/ 15 сентября 2011

У меня проблема с обработкой функции для обновления моего gridview.До сих пор я использовал DataSource Control, но на этот раз мне нужно построить все с нуля.Я хочу иметь возможность обновлять только самый последний столбец данных в сетке.Мои проблемы: 1) Когда я нажимаю кнопку «Изменить», все поля данных в строке преобразуются в текстовые поля - я бы хотел, чтобы это делал только последний. 2) Когда я нажимаю «Обновить», я получаю «Ссылка на объект не установлена ​​на экземпляр объекта."ошибка, и кажется, что "TextBox tProgress = (TextBox) grdMilestones.Rows [e.RowIndex] .Cells [3] .FindControl (" mstCompletition ");"просто не могу найти правильное значение, потому что, когда я заменяю его числом, оно работает нормально.

Это мое представление сетки

<asp:GridView ID="grdMilestones" runat="server" Width="940px" DataKeyNames="mstNo"
    OnRowEditing="grdMilestones_RowEditing"         
    OnRowCancelingEdit="grdMilestones_RowCancelingEdit" 
    OnRowUpdating="grdMilestones_RowUpdating" AutoGenerateColumns="False" 
    CssClass="milestonesGrid">
  <Columns>
  <asp:BoundField DataField="proName" HeaderText="Project Name" />
  <asp:BoundField DataField="mstDescription" HeaderText="Milestone Description" />
  <asp:BoundField DataField="mstPersResp" HeaderText="Milestone Leader" />
  <asp:BoundField DataField="mstCompletition" HeaderText="Progress" DataFormatString{0:F1}%" />     
  <asp:CommandField ButtonType="Button" ShowEditButton="true" EditText="Update progress" />
  </Columns>
</asp:GridView>

И код позади

protected void grdMilestones_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    int id = Int32.Parse(grdMilestones.DataKeys[e.RowIndex].Value.ToString());

    TextBox tProgress = (TextBox)grdMilestones.Rows[e.RowIndex].Cells[3].FindControl("mstCompletition");
    int prog = Convert.ToInt32(tProgress.Text.Trim());

    //ds.Rows[row.DataItemIndex]["mstCompletition"] = ((TextBox)(row.Cells[1].Controls[0])).Text;

    string updateSQL = "UPDATE milestonesPM SET mstCompletition = @mstCompletition WHERE mstNo = @mstNo";
    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand(updateSQL, con);
    cmd.Parameters.Add("@mstNo", SqlDbType.Int).Value = id;
    cmd.Parameters.Add("@mstCompletition", SqlDbType.SmallInt).Value = prog;

    con.Open();

    cmd.ExecuteNonQuery();
    grdMilestones.EditIndex = -1;
    grdMilestones.DataBind();

    con.Close();

    fillGrid();
}

С уважением

Бартош

1 Ответ

0 голосов
/ 15 сентября 2011

Вам нужно сделать столбцы, которые вы не хотите редактировать, доступными только для чтения, и создать EditItemTemplate для того, который вы хотите редактировать:

<asp:BoundField DataField="proName" 
        ReadOnly="true"
        HeaderText="Project Name" />
<asp:TemplateField HeaderText="Progress">
    <ItemTemplate>
        <asp:Label ID="mstCompletitionLabel" Text='<%# Eval("Description") %>' 
            runat="server" />
    </ItemTemplate>
    <EditItemTemplate>
        <asp:TextBox ID="mstCompletitionTextBox" CssClass="textBox"
            runat="server"
            TabIndex="12"
            Width="175"
            Text='<%# Eval("mstCompletition") %>' 
            MaxLength="20">
        </asp:TextBox>
        <asp:RequiredFieldValidator ID="mstCompletitionValidator" 
            runat="server"
            ErrorMessage="Required"
            Text="*" 
            ControlToValidate="mstCompletitionTextBox"
            SetFocusOnError="true"
            Display="Static">
       </asp:RequiredFieldValidator>                                                      
    </EditItemTemplate>
</asp:TemplateField> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...