3

グリッドにチェックボックスがあります。コードビハインドからそれらにアクセスし、チェックされた/チェックされていない行のデータを取得しようとしています.しかし、チェックボックスがチェックされた後でも、それらを Checked プロパティとして false として取得しています:

Aspx:

  <table width="100%">
            <asp:GridView ID="grdRequestsPending" runat="server" Width="100%" AutoGenerateColumns="false"
                BorderWidth="1px" BorderStyle="Solid" Style="margin-left: 0px" BorderColor="#ffcc00"
                RowStyle-BorderColor="#ffcc00" RowStyle-BorderStyle="Solid" RowStyle-BorderWidth="1px"
                GridLines="Both" DataKeyNames="ReqID,ApproverComments" On="grdRequestsPending_ItemDataBound" OnRowDataBound="grdRequestsPending_RowDataBound"
                OnPreRender="grdRequestsPending_PreRender">
                <RowStyle CssClass="dbGrid_Table_row" />
                <HeaderStyle CssClass="dbGrid_Table_Header" />
                <Columns>
                    <asp:TemplateField>
                        <HeaderTemplate>
                            <asp:Label ID="lblSelect" Text="Select All" runat="server"></asp:Label><br />
                            <asp:CheckBox ID="SelectAll" onclick="javascript:checkAllBoxes(this);" TextAlign="Left"
                                runat="server" />
                        </HeaderTemplate>
                        <ItemStyle Width="2%" />
                        <ItemTemplate>
                            <asp:CheckBox ID="chkReq" runat="server"/>
                        </ItemTemplate>
                        <ItemStyle HorizontalAlign="Center" Width="7%" />
                    </asp:TemplateField>
       </Columns>

しかし、私がこれらをチェックしているとき、私は常にコードビハインドでそれらを偽として取得しています:

        protected void UpdateVMRequestStatusByCapSupLead(int StatusId)
    {
        try
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("ReqId", typeof(int));
            dt.Columns.Add("StatusId", typeof(int));
            dt.Columns.Add("ModifiedBy", typeof(string));
            dt.Columns.Add("ModifiedDate", typeof(string));
            dt.Columns.Add("txtCommentSupLead", typeof(string));
            foreach (GridViewRow gr in grdRequestsPending.Rows)

            {
                CheckBox chk = (CheckBox)gr.FindControl("chkReq");

                if (chk.Checked)
                {
                    strReqId = strReqId + grdRequestsPending.DataKeys[gr.RowIndex].Value.ToString() + ',';

                    TextBox txtCommentSupLead = (TextBox)gr.FindControl("txtCommentSupLead");
                    dt.Rows.Add(dt.NewRow());
                    dt.Rows[dt.Rows.Count - 1]["ReqId"] = Convert.ToInt32(grdRequestsPending.DataKeys[gr.RowIndex].Value);
                    dt.Rows[dt.Rows.Count - 1]["StatusId"] = StatusId;
                    dt.Rows[dt.Rows.Count - 1]["ModifiedBy"] = Session["UserAccentureID"].ToString();
                    dt.Rows[dt.Rows.Count - 1]["txtCommentSupLead"] = txtCommentSupLead.Text;
                    dt.Rows[dt.Rows.Count - 1].AcceptChanges();
                    dt.Rows[dt.Rows.Count - 1].SetModified();
                }
            }

問題が発生していません。コントロールも正しく取得しています。

4

2 に答える 2

9

だけでなく、常に GridView をデータバインドしていると思いますif(!Page.IsPostBack)...

だからこれ入れてpage_load

protected void Page_Load(object sender, EventArgs e)
{                        
    if(!Page.IsPostBack)
    {
        DataBindControls(); // like GridView etc.
    }
}

コントロールDataBindすると、変更と ViewState が失われます。その場合、イベントでさえトリガーされません。したがって、最初のロードでのみそれを行う必要がありますEnableViewState="true"

于 2012-11-19T15:37:29.980 に答える
0

グリッドビューにチェックボックスを設定し、ボタンのクリックで値を取得する簡単な例を次に示します

デフォルト.aspx

<asp:GridView ID="gv" 
              runat="server" 
              AutoGenerateColumns="false" 
              OnRowDataBound="gv_RowDataBound">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:CheckBox ID="chkReq" runat="server" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>
<br />
<asp:Button ID="btnSubmit" 
            runat="server" 
            OnClick="btnSubmit_Click" 
            Text="Submit" />

Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    //Create 20 rows
    gv.DataSource = Enumerable.Range(1, 20);
    gv.DataBind();
  }
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
  var isCheckedList = new List<bool>();

  for(var index = 0; index < gv.Rows.Count; ++index)
  {
    var chkReq = (CheckBox)gv.Rows[index].FindControl("chkReq");
    isCheckedList.Add(chkReq.Checked);
  }

  //Look at isCheckedList to get a list of current values.
  System.Diagnostics.Debugger.Break();
}

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
  if (e.Row.RowType == DataControlRowType.DataRow)
  {
    var index = e.Row.RowIndex;

    //Strongly Bind Controls
    var chkReq = (CheckBox)e.Row.FindControl("chkReq");
    chkReq.Text = "Item " + index.ToString();
  }
}

すべてのコードを表示したわけではないため、Tim Schmelter が言ったような問題である可能性もあれば、他の問題である可能性もあります。この例では、グリッド ビューからチェックボックスの値を取得するために必要な基本を説明します。

于 2012-11-19T15:51:04.907 に答える