【问题标题】:CheckBox in RadGrid and Sending data to DatabaseRadGrid 中的复选框并将数据发送到数据库
【发布时间】:2011-11-17 22:36:58
【问题描述】:

我想要 RADGRID 中的复选框。以下是详细要求:

我使用存储过程中的 AutoGenerateColumns="True" 填充的所有 radgrid 列。我需要一个额外的复选框列。
在网格加载期间,我没有/不需要任何字段来绑定复选框。

用户可以选中任意数量的复选框,并且选择行的第二列数据应该发送到数据库。

以下是我用来显示复选框的代码,但完整的复选框列将被禁用。

<MasterTableView CommandItemDisplay="None" HeaderStyle-BorderStyle="None">  
 <Columns>  
 <rad:GridCheckBoxColumn HeaderText="LinkRisk" AllowFiltering="false" ReadOnly="false" HeaderStyle-Width="3%">  
 </rad:GridCheckBoxColumn>  
 </Columns>  
 </MasterTableView>  

我需要帮助:
1. 获取复选框。
2.如何将数据发送到数据库。
3.如何将其保存在数据库中。

假设 radgrid 的第 4、5、6 行被选中。
我需要在这些行中发送第二列的数据,即 44、55、66。
所以在我的数据库中,我的表的 3 个新行应该插入为:
标识值 44 55 一个 66

提前致谢!

【问题讨论】:

  • 您是否检查过网格属性是否设置为 readonly = false 并且 editRow = true?
  • 我在 RADGRID 中找不到这两个属性。但这意味着我还没有将其设置为不可编辑模式?
  • 我需要所有的复选框都可以在加载时进行编辑,而不是在点击编辑按钮时进行编辑。

标签: c# asp.net oracle10g telerik radgrid


【解决方案1】:

我继续按照“Emaad Ali”的评论帮助您找到解决方案。

第 1 步:

创建您的 Radgrid。 (我使用 Northwind 数据库作为数据源,因为它很简单,应该很容易理解。)在您认为“代码过载”之前,只需使用 Visual Studio 的向导连接到您的数据源,它将生成下面的大部分代码根据您所需的数据为您提供。

<telerik:RadGrid ID="RadGrid1" runat="server" CellSpacing="0" 
        DataSourceID="SqlDataSource1" GridLines="None">
        <MasterTableView AutoGenerateColumns="False" DataKeyNames="ProductID, ProductName"  
                        DataSourceID="SqlDataSource1">
        <CommandItemSettings ExportToPdfText="Export to PDF"></CommandItemSettings>

        <RowIndicatorColumn FilterControlAltText="Filter RowIndicator column">
        <HeaderStyle Width="20px"></HeaderStyle>
        </RowIndicatorColumn>

        <ExpandCollapseColumn FilterControlAltText="Filter ExpandColumn column">
        <HeaderStyle Width="20px"></HeaderStyle>
        </ExpandCollapseColumn>

            <Columns>
                <telerik:GridBoundColumn DataField="ProductID" DataType="System.Int32" 
                    FilterControlAltText="Filter ProductID column" HeaderText="ProductID" 
                    ReadOnly="True" SortExpression="ProductID" UniqueName="ProductID">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="ProductName" 
                    FilterControlAltText="Filter ProductName column" HeaderText="ProductName" 
                    SortExpression="ProductName" UniqueName="ProductName">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="SupplierID" DataType="System.Int32" 
                    FilterControlAltText="Filter SupplierID column" HeaderText="SupplierID" 
                    SortExpression="SupplierID" UniqueName="SupplierID">
                </telerik:GridBoundColumn>
                <telerik:GridBoundColumn DataField="UnitPrice" DataType="System.Decimal" 
                    FilterControlAltText="Filter UnitPrice column" HeaderText="UnitPrice" 
                    SortExpression="UnitPrice" UniqueName="UnitPrice">
                </telerik:GridBoundColumn>
                <telerik:GridTemplateColumn HeaderText="Update"> 
                <ItemTemplate> 
                    <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" OnCheckedChanged="CheckBox2_CheckedChanged" /> 
                </ItemTemplate> 
            </telerik:GridTemplateColumn> 
            </Columns>

        <EditFormSettings>
        <EditColumn FilterControlAltText="Filter EditCommandColumn column"></EditColumn>
        </EditFormSettings>
        </MasterTableView>

        <FilterMenu EnableImageSprites="False"></FilterMenu>

        <HeaderContextMenu CssClass="GridContextMenu GridContextMenu_Default"></HeaderContextMenu>
    </telerik:RadGrid>

第 2 步: 在您的数据源中自动生成的列之后添加以下列。如果您查看步骤 1 中的代码,您会看到我已经添加了它。您可以逐字复制并粘贴下面的代码,它将起作用。

<telerik:GridTemplateColumn HeaderText="Update"> 
            <ItemTemplate> 
                <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" OnCheckedChanged="CheckBox2_CheckedChanged" /> 
            </ItemTemplate> 
        </telerik:GridTemplateColumn> 

此时运行时,网格将如下所示:

第三步: 在网格属性下的字段 DataKeyNames="" 中,您需要添加要从中读取数据的列的名称。你说你想要第二列的数据,所以我也用了第二列。在 Radgrid 中,我的第二列有 DataField="ProductName",所以我需要将它添加到我的网格的 DataKeyNames 属性中,使其成为 DataKeyNames="ProductName"。这将允许我们在第 4 步的 c# 代码中读取该列中的数据。

第 4 步:

转到后面的代码并粘贴此代码:

protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
{
    CheckBox chk = (CheckBox)sender;
    bool status = chk.Checked;
    GridDataItem item = (GridDataItem)chk.NamingContainer;
    string keyvalue = item.GetDataKeyValue("ProductName").ToString();
    string connectionString ="";
    if(status)
    {

    }
}

如您所见,此代码中引用了“ProductName”,因此您必须将其更改为您的列名。

第 5 步:

在 if(status) 条件中插入将数据发送到您的数据库所需的代码,这样它只会在您第一次检查时触发。

注意:

如果您需要从其他列获取数据,您只需将列名添加到 DataKeyNames="column1,column2" 字段,然后通过 c# 引用它们:

string value1 = item.GetDataKeyValue("column1").ToString();
string value2 = item.GetDataKeyValue("column2").ToString();

然后您可以将这些值连接到您可能使用的任何数据库代码中。

我不了解 Oracle,但我添加到 if(Status) 的 SQL 代码如下所示:

    SqlConnection SqlConnection = new SqlConnection(connectionString);
    SqlCommand SqlCommand = new SqlCommand();
    SqlCommand.CommandText = "update products set [UnitPrice] = '100' where [ProductName] = '" + keyvalue + "'";
    SqlCommand.Connection = SqlConnection;
    SqlConnection.Open();
    SqlCommand.ExecuteNonQuery();
    SqlConnection.Close();

这是一个基本更新,但您应该了解将其应用到将其插入表中的代码的想法。

【讨论】:

  • 我将问题解释为如何使用 autogeneratecolumns="true" 执行此操作。我有类似的问题,但我的数据源来自 csv 文件,我不想对列进行硬编码。
【解决方案2】:

改用模板列:

<tel:GridTemplateColumn>
   <ItemTemplate>
       <asp:Checkbox id="chk" runat="server" />
   </ItemTemplate>
</tel:GridTemplateColumn>

复选框列的问题是它只显示当前行以进行编辑。它将为每一行显示一个复选框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2013-08-09
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多