Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 将字符串[]呈现为一系列可编辑控件?_Asp.net_Dynamic_Formatting_String - Fatal编程技术网

Asp.net 将字符串[]呈现为一系列可编辑控件?

Asp.net 将字符串[]呈现为一系列可编辑控件?,asp.net,dynamic,formatting,string,Asp.net,Dynamic,Formatting,String,我有一个字符串[],其中包含从一段文本中解析出来的单个单词。我需要在自己的单元格中显示每个单词,并根据单词的长度为每个单元格指定一个动态宽度。我希望能够在每行的最大宽度内有尽可能多的单词 简言之,我试图将给定的一段文本作为一系列可编辑控件呈现,呈现方式类似于它可能显示为纯文本文档的方式,每个单词在每个“行”上仅占用所需的空间 我首先尝试在表模式下使用带有RepeatLayout的DataList,并将RepeatColumns设置为10,其中的Repeater包含一个Label控件;这导致每行1

我有一个字符串[],其中包含从一段文本中解析出来的单个单词。我需要在自己的单元格中显示每个单词,并根据单词的长度为每个单元格指定一个动态宽度。我希望能够在每行的最大宽度内有尽可能多的单词

简言之,我试图将给定的一段文本作为一系列可编辑控件呈现,呈现方式类似于它可能显示为纯文本文档的方式,每个单词在每个“行”上仅占用所需的空间

我首先尝试在表模式下使用带有RepeatLayout的DataList,并将RepeatColumns设置为10,其中的Repeater包含一个Label控件;这导致每行10个字,但每个单元格的宽度固定

我曾经考虑过使用一个带有单列的GridView,我会在每行中填充尽可能多的单词(以标签控件的形式),根据需要添加新行,直到构建整个段落


任何人都可以分享一个优雅的方法来做到这一点吗?

我能想到的最好的方法就是使用一个中继器,把剩下的东西都浮起来

<asp:Repeater runat="server" id="rptr">
   <ItemTemplate>
      <span style="float:left; height:22px; line-height:22px;"><%# Eval("Word") %></span>
   </ItemTemplate>
</asp:Repeater>

首先,我想说,从用户界面的角度来看,我不完全确定您为什么需要这样做,但如果必须这样做,您可以按照以下思路来做:

  • 从字符串[]开始
  • 创建一个
    列表
  • 在原始数组中循环,将字符串添加到新的
    列表中
  • 达到所需的字符总长度后,将
    列表
    添加到
    列表
    (其中包含行)
  • 重复这些步骤,直到完成原始阵列的所有步骤
完成此操作后,将列表o'列表绑定到如下所示的中继器(伪代码;可能有点不正确):



您正在寻找的魔法是“contenteditable”属性。适用于IE、Firefox和Chrome

我不知道你到底在干什么,勒芒。。。但这应该是可行的:

您的代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    //creating some bogus collection of strings.
    string[] parts = { "this", "is", "a", "test", "of", "the", "goofiest", "ui", "ever" };
    //bind it to the repeater.
    rptr.DataSource = parts;
    rptr.DataBind();
    //now we'll add them to a JavaScript array we can access client side.
    StringBuilder sb = new StringBuilder();
    sb.Append("document.stringItems = new Array();");
    for (int i = 0; i < parts.Length; i++)
        sb.AppendFormat("document.stringItems[{0}] = '{1}';", i, parts[i]);
    ScriptManager.RegisterClientScriptBlock(this, GetType(), "someKey", sb.ToString(), true);
}
protected void btnTest_Click(object sender, EventArgs e)
{
    //display the result just so we can see it's working.
    lblResult.Text = hdnResult.Value;
}
受保护的无效页面加载(对象发送方,事件参数e)
{
//创建一些伪造的字符串集合。
string[]parts={“this”、“is”、“a”、“test”、“of”、“the”、“goofiest”、“ui”、“ever”};
//将其绑定到中继器。
rptr.DataSource=零件;
rptr.DataBind();
//现在我们将它们添加到一个JavaScript数组中,我们可以访问客户端。
StringBuilder sb=新的StringBuilder();
sb.Append(“document.stringItems=newarray();”;
对于(int i=0;i
您的.ASPX:

<asp:Repeater ID="rptr" runat="server">
    <ItemTemplate>
        <span contenteditable="true" style="border: solid 1px;" onkeyup="updateItem(event, <%#Container.ItemIndex%>)">
            <%#Container.DataItem%></span>
    </ItemTemplate>
</asp:Repeater>
<asp:HiddenField ID="hdnResult" runat="server" />
<asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />
<script type="text/javascript" language="javascript">
    //<![CDATA[
    function updateItem(e, index) {
        //get the source element. (magic here for cross browser lameness)
        var src;
        if(window.event) {
            e = window.event;
            src = e.srcElement;
        }else{
            src = e.target;
        }
        //update our item in our array.
        document.stringItems[index] = src.innerHTML;
        //update our hidden field.
        var s = '';
        var space = false;
        for (var i = 0; i < document.stringItems.length; i++) {
            if (space)
                s += ' ';
            else
                space = true;
            s += document.stringItems[i];
        }
        var hdnResult = document.getElementById('<%=hdnResult.ClientID%>');
        hdnResult.value = s;
    }
    //]]>
</script>
<asp:Label ID="lblResult" runat="server"></asp:Label>

//
您还必须为onkeypress添加一些javascript,以确保它们没有添加回车符、空格或其他您不希望它们添加的内容。。。但这是最基本的想法


我希望这有帮助。祝你好运。

这与我正在从事的一个项目有关,该项目依赖于能够分解一段文字,以便对其文字进行操作并使其可以单独编辑。有点像一个基于网络的记事本,除了每个单词被视为不仅仅是一个字符串。
<asp:Repeater ID="rptr" runat="server">
    <ItemTemplate>
        <span contenteditable="true" style="border: solid 1px;" onkeyup="updateItem(event, <%#Container.ItemIndex%>)">
            <%#Container.DataItem%></span>
    </ItemTemplate>
</asp:Repeater>
<asp:HiddenField ID="hdnResult" runat="server" />
<asp:Button ID="btnTest" runat="server" Text="Test" OnClick="btnTest_Click" />
<script type="text/javascript" language="javascript">
    //<![CDATA[
    function updateItem(e, index) {
        //get the source element. (magic here for cross browser lameness)
        var src;
        if(window.event) {
            e = window.event;
            src = e.srcElement;
        }else{
            src = e.target;
        }
        //update our item in our array.
        document.stringItems[index] = src.innerHTML;
        //update our hidden field.
        var s = '';
        var space = false;
        for (var i = 0; i < document.stringItems.length; i++) {
            if (space)
                s += ' ';
            else
                space = true;
            s += document.stringItems[i];
        }
        var hdnResult = document.getElementById('<%=hdnResult.ClientID%>');
        hdnResult.value = s;
    }
    //]]>
</script>
<asp:Label ID="lblResult" runat="server"></asp:Label>