【问题标题】:select checkboxes dynamically asp net动态选择复选框 asp net
【发布时间】:2018-03-22 23:12:09
【问题描述】:

如果datagrid 在dataset 中包含匹配的value,我想动态选择datagrid 中的checkbox。当用户选择dropdownlist 的值时,我正在绑定datagrid。

为此,我编写了以下代码。

protected void dgAvailableCandidates_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        DataSet dsSelectedCandidates = (DataSet)Session["SelectedCandidatesDataSet"];

        if (dsSelectedCandidates.Tables[1].Rows.Count > 0)
        {
            for (int i = 0; i < dgAvailableCandidates.Items.Count; i++)
            {
               string indRow = dgAvailableCandidates.DataKeys[i].ToString();

               if (indRow == dsSelectedCandidates.Tables[1].Rows[i]["fk_recId"].ToString())
               {
                    CheckBox shouldCheck = (CheckBox)dgAvailableCandidates.Items[i].FindControl("chkbox_SelectCandidate");
                    shouldCheck.Checked = true;
               }

             }
        }

    }

我创建了一个存储过程,它返回两个datatables,tables0 是bind,datagrid 和table1 持有recordIds,它们已经在database table 中作为selected or bit value (1) 可用。

我的问题在这里,当datagrid 在table1 中找不到value 时,它会抛出exception“没有匹配的行”。我应该如何解决这个exception

谢谢!

【问题讨论】:

  • 在直接使用它的值之前,您应该检查table1中是否存在行,这将解决您的问题。
  • @Dinesh Prajapati 一些代码可以帮助我更好地理解您的提示。谢谢!
  • 在哪一行代码(从上面的代码)抛出异常?
  • 这个if (indRow == dsSelectedCandidates.Tables[1].Rows[i]["fk_recId"].ToString()) 我使用了一个数组列表,但是它抛出了一个索引超出范围的错误。 ...

标签: c# asp.net checkbox webforms


【解决方案1】:

我已经使用 Telerik 网格完成了。

<telerik:RadGrid ID="RadGrid1" runat="server" OnItemDataBound="RadGrid1_OnItemDataBound">
            <MasterTableView AutoGenerateColumns="false" TableLayout="Fixed" DataKeyNames="fk_recId">
                <Columns>
                    <telerik:GridBoundColumn UniqueName="ShipName" DataField="data_dummy"></telerik:GridBoundColumn>
                    <telerik:GridTemplateColumn HeaderText="Check">
                        <ItemTemplate>
                           <asp:CheckBox runat="server" ID="cb"/>
                       </ItemTemplate>
                    </telerik:GridTemplateColumn>
                </Columns>
            </MasterTableView>
        </telerik:RadGrid>

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {

                AnotherSample();
                BindTable();
            }
        }
        private void BindTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new []{new DataColumn("fk_recId"),new DataColumn("data_dummy")});
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["fk_recId"] = i + 1;
                dr["data_dummy"] = "data" + i + 1;
                dt.Rows.Add(dr);
            }
            RadGrid1.DataSource = dt;
            RadGrid1.DataBind();
        }

        protected void RadGrid1_OnItemDataBound(object sender, GridItemEventArgs e)
        {
            if (e.Item is GridDataItem)
            {
                GridDataItem item = e.Item as GridDataItem;
                string strID = item.GetDataKeyValue("fk_recId").ToString();
                if(((DataTable)ViewState["dt"]).AsEnumerable().Any(i=>i["fk_recId2"].ToString()== strID))
                {
                    CheckBox shouldCheck = (CheckBox)item.FindControl("cb");
                    shouldCheck.Checked = true;
                }
            }
        }


        private void AnotherSample()
    {
        DataTable dt = new DataTable();
        dt.Columns.AddRange(new[] { new DataColumn("fk_recId2"), new DataColumn("data_dummy") });
        for (int i = 0; i < 2; i++)
        {
            DataRow dr = dt.NewRow();
            dr["fk_recId2"] = i + 1;
            dr["data_dummy"] = "data" + i + 1;
            dt.Rows.Add(dr);
        }
        DataRow drq = dt.NewRow();
        drq["fk_recId2"] = 100;
        drq["data_dummy"] = "data";
        dt.Rows.Add(drq);
        ViewState["dt"] = dt;
    }

【讨论】:

  • 非常感谢您的善意努力。我不知道telerik,请你给dg_OnItemDataBound一个等效的c#代码谢谢
  • 请在您的最后运行我的 sn-p 并相应地修改它并让我知道..实际上我正忙于我的项目对不起@NikhilG Telerik 中有很好的帮助文档。
【解决方案2】:

在从索引访问行之前,您必须添加以下条件以检查行的存在。

// This condition will check the existence of row before accessing its value.
if(dsSelectedCandidates.Tables[1].Rows.Count > i)
{
    if (indRow == dsSelectedCandidates.Tables[1].Rows[i]["fk_recId"].ToString())
        {
           CheckBox shouldCheck = (CheckBox)dgAvailableCandidates.Items[i].FindControl("chkbox_SelectCandidate");
           shouldCheck.Checked = true;
        }
}

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2010-11-13
    • 2016-09-23
    相关资源
    最近更新 更多