繁体   English   中英

当尝试将复选框添加到 asp.net forms 上的网格视图时出现错误?

[英]when try to add check box to grid view on asp.net forms i get error?

我在 asp.net web forms 和 c# 上工作 我需要添加复选框列作为 gridview 的最后一列

但我不知道如何添加

static  string con =
   "Data Source=DESKTOP-L558MLK\\AHMEDSALAHSQL;" +
   "Initial Catalog=UnionCoop;" +
   "User id=sa;" +
   "Password=321;";
        SqlConnection conn = new SqlConnection(con);
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GridViewSearch.DataSource = GetDataForSearch();
                GridViewSearch.DataBind();
            }

        }


        public DataTable GetDataForSearch()
        {
            string response = string.Empty;
            SqlCommand cmd = new SqlCommand();
            DataTable dt = new DataTable();
            try
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandText = "select top 10 datelogged AS EntredDatetime, Doc_type AS OrderType, Printer_name, BranchID AS BranchCode, id from Print_Report";
                cmd.CommandType = CommandType.Text;
                cmd.CommandTimeout = 50000;
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                sda.Fill(dt);
            }
            catch (Exception ex)
            {
                response = ex.Message;
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
            return dt;

        }

on aspx page
 <asp:GridView ID="GridViewSearch" runat="server">
        </asp:GridView>
  GridViewSearch.DataSource = GetDataForSearch();
                DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
                checkColumn.Name = "X";
                checkColumn.HeaderText = "X";
                checkColumn.Width = 50;
                checkColumn.ReadOnly = false;
                checkColumn.FillWeight = 10; //if the datagridview is resized (on form resize) the checkbox won't take up too much; value is relative to the other columns' fill values
                GridViewSearch.Columns.Add(checkColumn);
                GridViewSearch.DataBind();

我在下面的行中收到错误

GridViewSearch.Columns.Add(checkColumn);

参数 1 无法从 system.windows.forms.datagridviewcheckbox 转换为 system.web.ui.webcontrol.databoundfield

那么如何解决这个问题呢?

在我看来,如果您想说一个按钮、复选框或下拉菜单?

为什么不将其添加到标记中。

所以,像这样说:

<div id="MyGridPick" runat="server" style="display:normal;width:40%">
    <asp:Label ID="lblSel" runat="server" Text="" Font-Size="X-Large"></asp:Label>
    <br />
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ID"  cssclass="table table-hover" OnRowDataBound="GridView1_RowDataBound" >
        <Columns>
            <asp:BoundField DataField="FirstName" HeaderText="FirstName"     />
            <asp:BoundField DataField="LastName" HeaderText="LastName"       />
            <asp:BoundField DataField="City" HeaderText="City"                />
            <asp:BoundField DataField="HotelName" HeaderText="HotelName" ItemStyle-Width="120px"     />
            <asp:BoundField DataField="Description" HeaderText="Description" />
            <asp:TemplateField HeaderText="Select" ItemStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="chkSel" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>

然后我要加载的代码是这样的:

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

    void LoadGrid()
    {
        SqlCommand cmdSQL = 
            new SqlCommand("SELECT * FROM tblHotelsA ORDER BY HotelName");
        GridView1.DataSource = MyRstP(cmdSQL);
        GridView1.DataBind();
    }

现在,我当然厌倦了一遍又一遍地输入连接字符串。 所以,我有一个像这样的“通用”例程:

    public DataTable MyRstP(SqlCommand cmdSQL)
    {
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            cmdSQL.Connection = conn;
            using (cmdSQL)
            {
                conn.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }

以及上面运行的结果:

在此处输入图像描述

因此,当您只需将一个复选框放入 gridview 时,很难“添加”一个复选框控件。

按钮也是如此,也许我们想要一个按钮来“查看”或编辑上面的行,或类似的东西。

所以,再一次,只需放入一个简单的简按钮,这样说:

            <asp:TemplateField HeaderText="View" ItemStyle-HorizontalAlign="Center" >
                <ItemTemplate>
                    <asp:Button ID="bView" runat="server" Text="View" CssClass="btn"
                        OnClick="bView_Click" />
                </ItemTemplate>
            </asp:TemplateField>

现在我们有了这个:

在此处输入图像描述

甚至更好?

那么,既然那个按钮(或复选框)是一个普通的简标准控件?

然后你可以添加标准事件,比如点击事件,或者你想要的任何东西。

为按钮单击说出此代码(显示如何获取当前行)。

protected void bView_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    GridViewRow gRow = btn.NamingContainer as GridViewRow;
    int PKID = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];

    SqlCommand cmdSQL = 
        new SqlCommand("SELECT * FROM tblHotelsA WHERE ID = @ID");
    cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = PKID;

    DataTable dtHotel = MyRstP(cmdSQL);
    General.FLoader(MyEditArea, dtHotel.Rows[0]);

    MyGridPick.Style.Add("display", "none");        // hide grid
    MyEditArea.Style.Add("display", "normal");      // show edit div area

}

我们现在得到/看到这个:

在此处输入图像描述

编辑:处理每个选中/选定的行。

这:

protected void cmdSelProcess_Click(object sender, EventArgs e)
{
    // process all rows in GV with check box

    String sPK = "";
    List<int> MySelected = new List<int>();
    foreach (GridViewRow gRow in GridView1.Rows)
    {
        CheckBox chkSel = (CheckBox)gRow.FindControl("chkSel");
        if (chkSel.Checked)
        {
            int PK = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];
            // add pk value of row to our list
            MySelected.Add(PK);
            // Or we could process data based on current gRow
            if (sPK != "")
                sPK += ",";

            sPK += PK.ToString();
            Debug.Print(PK.ToString());
        }

    }
    // at this point, we have a nice list of selected in MySelected
    // or, maybe process as a data table

    SqlCommand cmdSQL =
        new SqlCommand($"SELECT * FROM tblHotelsA where ID IN({sPK})");

    DataTable rstSelected = MyRstP(cmdSQL);
    // 
    foreach (DataRow dr in rstSelected.Rows)
    {
        // do whatever
    }

}

Datagridviewcheckboxcolumn 是一个 Windows formx object。你在 web forms 工作。有关webforms 复选框字段的信息,请参阅下面的链接

    CheckBoxField checkColumn = new CheckBoxField();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM