2

我有一个受 SQL 约束的 gridview。在某些列中有位值。当我使用 C# 将值放入 gridview 时,会显示复选框。我需要将该列的值提取到文本中。

    SqlConnection sConnection = new SqlConnection(MyConnectionString);
    SqlCommand sCommand = new SqlCommand();
    using (sConnection)
    {
        sCommand.Connection = sConnection;
        sCommand.CommandText = "MyStoredProcedure";
        sCommand.CommandType = CommandType.StoredProcedure;
        sCommand.Connection.Open();
        SqlDataReader reader = sCommand.ExecuteReader();
        if (reader.HasRows)
        {
            while (reader.Read())
            {
                gridView.DataSource = reader;
                gridView.DataBind();
            }
            for (int i = 0; i < gridView.Rows.Count; i++)
            {
                ListBox1.Items.Add(gridView.Rows[i].Cells[3].Text);
            }
        }
    }

gridview 列数据类型为“位”。我无权访问数据库或存储过程来更改那里的任何内容。我需要以某种方式提取“0”或“1”值,但是当我像上面那样做时,文本是空白的。

我也尝试使用“GetOrdinal”。它从数据库返回了一个真/假值,但我不知道如何获取网格视图中每个项目的值。

    if (!reader.IsDBNull(reader.GetOrdinal("MyColumn1")))
    {
        ListBox1.Items.Add(reader.GetOrdinal("MyColumn1").ToString());
    }
4

3 回答 3

1

总体概述:

  • 您需要能够找到生成的 CheckBox 并获取其“Checked”属性的值。

  • 为此,您需要能够在 GridViewRow 上使用 FindControl() 方法。

  • 要使用 FindControl,CheckBox 需要一个可预测的名称。
  • 要获得可预测的名称,您需要将该列设为 TemplateColumn,以便您可以在 ASPX 页面上的标记中指定 CheckBox 的名称。

这里有一套完整的工作代码:http: //www.codeproject.com/Articles/25056/The-RIGHT-Way-to-Use-Checkboxes-in-a-NET-Repeater

这显示了Repeater 的代码,但它与任何DataBound 控件的原理和通用代码相同。

下面的代码应该可以修改以匹配您的数据库名称:

 <asp:TemplateField> 
   <ItemTemplate > 
       <asp:checkbox id="MyColumnNameCheckbox" runat="server" /> 
   </ItemTemplate> 
 </asp:TemplateField> 

    string defaultvalue = "0"; // To be used to display the value of the original bit field.
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     CheckBox chkBx = (CheckBox)row.FindControl("MyColumnNameCheckbox"); 

        if (chkBx != null && chkBx.Checked) 
        { 
            defaultvalue = "1";
        } 
    } 
于 2012-09-11T19:54:40.770 回答
1

我能够弄清楚。谢谢,大卫斯特拉顿,为我指明了正确的方向。我首先通过为动态创建的控件分配一个 id 来做到这一点。然后是 FindControl()...

Control ctrl = GridView1.SelectedRow.Cells[4].Control[0];
ctrl.ID = "ctrl";
Boolean result = Convert.ToBoolean(((Checkbox)GridView1.Rows[0].Cells[4].FindControl("ctrl")).Checked);
TextBox1.Text = result.ToString();

这将返回“True”或“False”的值......

再次感谢。

于 2012-09-19T17:11:38.113 回答
1

另一种解决方法:

bool result = (GridView1.SelectedRow.Cells[4].Control[0] as Checkbox).Checked;
TextBox1.Text = result.ToString();

它用更少的代码解决了问题:)

于 2017-11-29T18:06:26.720 回答